結果
問題 |
No.168 ものさし
|
ユーザー |
![]() |
提出日時 | 2015-07-26 19:45:22 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,283 bytes |
コンパイル時間 | 1,578 ms |
コンパイル使用メモリ | 169,356 KB |
実行使用メモリ | 11,732 KB |
最終ジャッジ日時 | 2024-07-08 14:10:20 |
合計ジャッジ時間 | 2,913 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 5 WA * 14 |
ソースコード
#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 = 1LL << 60; 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; } cout << (int)(sqrtl(ret) + 9.99999999999999999) / 10 * 10 << endl; }