結果
問題 | No.168 ものさし |
ユーザー |
![]() |
提出日時 | 2019-10-20 14:47:38 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 83 ms / 2,000 ms |
コード長 | 1,290 bytes |
コンパイル時間 | 1,913 ms |
コンパイル使用メモリ | 173,288 KB |
実行使用メモリ | 11,444 KB |
最終ジャッジ日時 | 2024-07-02 17:25:58 |
合計ジャッジ時間 | 3,306 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 19 |
ソースコード
#include <bits/stdc++.h>using namespace std;#define rep(i,n) for(int i = 0; i < (n);i++)#define sz(x) int(x.size())typedef long long ll;typedef pair<int,int> P;struct UnionFind{vector<int> data;UnionFind(int sz) {data.assign(sz, -1);}bool unite(int x, int y) {x = find(x), y = find(y);if(x == y) return (false);if(data[x] > data[y]) swap(x, y);//親は負でサイズを保存data[x] += data[y];data[y] = x;return (true);}int find(int k) {if(data[k] < 0) return (k);return (data[k] = find(data[k]));}bool same(int x, int y){return find(x) == find(y);}int size(int k) {return (-data[find(k)]);}};int n;ll dist[1010][1010];bool ok(ll len){UnionFind uf(n);rep(x,n) rep(y,n) {if (len * len >= dist[x][y]) uf.unite(x,y);}return uf.same(0,n-1);}int main(){cin >> n;vector<ll> x(n), y(n);rep(i,n) cin >> x[i] >> y[i];rep(i,n) {rep(j,n) dist[i][j] = (x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]);}ll left = 0, right = 1e10;while (right - left > 1) {ll mid = (left + right) / 2;if ( ok(mid) ) right = mid;else left = mid;}if (right % 10 != 0) (right -= right % 10) += 10;cout << right << endl;return 0;}