結果
| 問題 |
No.168 ものさし
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-12-09 10:15:19 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,554 bytes |
| コンパイル時間 | 1,665 ms |
| コンパイル使用メモリ | 160,880 KB |
| 実行使用メモリ | 11,340 KB |
| 最終ジャッジ日時 | 2024-11-30 02:11:18 |
| 合計ジャッジ時間 | 2,542 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 18 WA * 1 |
ソースコード
#include "bits/stdc++.h"
using namespace std;
#define print(x) cout<<x<<endl;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define REP(i,a) for(int i=0;i<a;i++)
#define printall(n,array) {for(int i=0;i<n;i++){cout<<array[i]<<" ";}cout<<endl;}
#define U() cout<<endl;
typedef long long ll;
typedef pair<int, int> PI;
typedef pair<int, PI> V;
typedef vector<int> VE;
const ll mod = 1000000007; //10^9+7
int n;
ll x[1003];
ll y[1003];
ll d[1003][1003];
int par[10002]; //親を表す
int myrank[10002]; //木の深さを表す
void init(int n){ //初期化
REP(i,n){
par[i]=i;
myrank[i]=0;
}
}
int find(int x){ //親を見つける
if(par[x]==x){
return x;
}else{
return par[x]=find(par[x]);
}
}
void unit(int x, int y){ //x,yを併合
x=find(x);
y=find(y);
if(x==y)return;
if(myrank[x]<myrank[y]){
par[x]=y;
}else{
par[y]=x;
if(myrank[x]==myrank[y])myrank[x]++;
}
}
bool same(int x, int y){ //x,yが同じグループか判定
return find(x)==find(y);
}
bool solve(ll len){
init(n);
REP(i,n)REP(j,n){
if(d[i][j]<=len*len){
unit(i,j);
}
}
return same(0,n-1);
}
int main(){
cin>>n;
REP(i,n)cin>>x[i]>>y[i];
REP(i,n)REP(j,n){
d[i][j]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}
ll left=0, right=mod;
while(right-left>1){
ll mid=(left+right)/2;
if(solve(mid)){
right=mid;
}else{
left=mid+1;
}
}
ll ans=left;
REP(i,11){
if(ans%10==0){
if(solve(ans))break;
}
ans++;
}
print(ans);
return 0;
}