結果
問題 | No.168 ものさし |
ユーザー |
![]() |
提出日時 | 2015-03-22 12:31:37 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 103 ms / 2,000 ms |
コード長 | 2,066 bytes |
コンパイル時間 | 985 ms |
コンパイル使用メモリ | 97,804 KB |
実行使用メモリ | 19,932 KB |
最終ジャッジ日時 | 2024-12-24 07:06:05 |
合計ジャッジ時間 | 2,592 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 19 |
ソースコード
#include<iostream>#include<sstream>#include<cstdio>#include<cstring>#include<algorithm>#include<string>#include<vector>#include<cmath>#include<set>#include<map>#include<stack>#include<queue>#include<numeric>#include<functional>#include<complex>using namespace std;#define BET(a,b,c) ((a)<=(b)&&(b)<(c))#define FOR(i,n) for(int i=0,i##_end=(int(n));i<i##_end;i++)#define SZ(x) (int)(x.size())#define ALL(x) (x).begin(),(x).end()#define MP make_pair#define FOR_EACH(it,v) for(__typeof(v.begin()) it=v.begin(),it_end=v.end() ; it != it_end ; it++)typedef vector<int> VI;typedef vector<VI> VVI;long double dist(long long x, long long y){long long D = x * x + y * y;long long sD = sqrt(D);double eps = 0;if(sD * sD != D) eps += 1e-3;return sqrt(D) + eps;}long long adjustDist(long long x, long long y){long long D = x * x + y * y;long long r = sqrt(D);while(r * r < D) r++;while(r % 10) r++;return r;}struct DisjointSet {vector<int> group ;DisjointSet(int n) : group(n, -1) { ; }bool unionSet(int x, int y) {x = root(x); y = root(y);if (x != y) {if (group[y] > group[x]) swap(x, y);group[x] += group[y];group[y] = x;}return x != y;}bool is_sameSet(int x, int y) { return root(x) == root(y); }int root(int x) { return group[x] < 0 ? x : group[x] = root(group[x]); }int size(int x) { return -group[root(x)]; }};int main(){int N;cin>>N;vector<double> X(N);vector<double> Y(N);FOR(i,N) cin>>X[i]>>Y[i];vector<pair<long double, pair<int,int> > > edges;FOR(i,N){FOR(j,i) edges.push_back(MP(dist(X[i]-X[j],Y[i]-Y[j]), MP(i,j)));}sort(ALL(edges));DisjointSet D(N);long long ans = 0;for(const auto &e : edges){int x = e.second.first;int y = e.second.second;if(D.unionSet(x, y)){ans = adjustDist(X[x]-X[y],Y[x]-Y[y]);if(D.is_sameSet(0, N-1)) break;}}printf("%lld\n", ans);return 0;}