結果
問題 | No.168 ものさし |
ユーザー | ei1333333 |
提出日時 | 2015-07-26 19:54:26 |
言語 | C++11 (gcc 11.4.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,407 bytes |
コンパイル時間 | 1,624 ms |
コンパイル使用メモリ | 167,820 KB |
実行使用メモリ | 11,732 KB |
最終ジャッジ日時 | 2024-07-08 14:10:30 |
合計ジャッジ時間 | 2,935 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 2 ms
5,376 KB |
testcase_04 | AC | 1 ms
5,376 KB |
testcase_05 | AC | 1 ms
5,376 KB |
testcase_06 | AC | 2 ms
5,376 KB |
testcase_07 | AC | 2 ms
5,376 KB |
testcase_08 | AC | 2 ms
5,376 KB |
testcase_09 | WA | - |
testcase_10 | WA | - |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | AC | 64 ms
11,480 KB |
testcase_15 | AC | 2 ms
5,376 KB |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
testcase_19 | WA | - |
testcase_20 | WA | - |
testcase_21 | WA | - |
testcase_22 | WA | - |
ソースコード
#include<bits/stdc++.h> using namespace std; typedef long long int64; #define ABS(a, b) max(a - b, b - a) #define SQR(a) ((int64)(a)*(int64)(a)) struct edge { int u, v; int64 cost; bool operator<(const edge& e) const { return(cost < e.cost); } }; struct UnionFind { vector< int > data; UnionFind(int sz){ data.assign(sz, -1); } int Find(int x){ return(data[x] < 0 ? x : data[x] = Find(data[x])); } void Unite(int a, int b) { a = Find(a), b = Find(b); if(a == b) return; if(data[a] < data[b]) swap(a, b); data[b] += data[a]; data[a] = b; } bool Same(int a, int b) { return(Find(a) == Find(b)); } }; int main() { int N, X[1000], Y[1000]; cin >> N; UnionFind uf(N); for(int i = 0; i < N; i++) { cin >> X[i] >> Y[i]; } vector< edge > edges; for(int i = 0; i < N; i++) { for(int j = i + 1; j < N; j++) { edges.push_back((edge){i, j, SQR(ABS(X[i], X[j])) + SQR(ABS(Y[i], Y[j]))}); } } sort(edges.begin(), edges.end()); int64 ret = 0; for(int i = 0; i < N; i++) { edge& e = edges[i]; if(uf.Same(e.u, e.v)) continue; ret = e.cost; uf.Unite(e.u, e.v); if(uf.Same(0, N - 1)) break; } int64 low = 0, high = 1LL << 32; while(high - low > 0) { int64 mid = (low + high) >> 1LL; if(SQR(mid) >= ret) high = mid; else low = mid + 1; } cout << (low + 9) / 10 * 10 << endl; }