結果
| 問題 | No.96 圏外です。 |
| コンテスト | |
| ユーザー |
imgry22
|
| 提出日時 | 2014-12-19 20:03:15 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,878 bytes |
| 記録 | |
| コンパイル時間 | 2,380 ms |
| コンパイル使用メモリ | 166,664 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-06-12 01:50:58 |
| 合計ジャッジ時間 | 4,910 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 5 WA * 7 RE * 16 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef unsigned long long int llu;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pair<int, int> > vii;
#define rrep(i, m, n) for(int i=m; i<n; i++)
#define erep(i, n) for(int i=1; i<=n; i++)
#define rep(i, n) for(int i=0; i<n; i++)
#define rrev(i, m, n) for(int i=n-1; i>=m; i--)
#define erev(i, n) for(int i=n; i>=1; i--)
#define rev(i, n) for(int i=n-1; i>=0; i--)
#define EACH(v) (v).begin(), (v).end()
#define CNT(a, n, x) (upper_bound(a, a+n, x)-lower_bound(a, a+n, x))
#define mp make_pair
template<class T1, class T2> inline void minup(T1 &m, T2 x){ if(m>x) m=static_cast<T2>(x); }
template<class T1, class T2> inline void maxup(T1 &m, T2 x){ if(m<x) m=static_cast<T2>(x); }
#define INF 1000000000
#define MOD 1000000009
#define EPS 1E-9
typedef complex<int> P;
int dot(P p, P q){ return real(p*conj(q)); }
int det(P p, P q){ return imag(p*conj(q)); }
#define MAX_N 1000
int n;
int x, y;
P z[MAX_N];
double res;
int dist(P z, P w) { return real(z-w)*real(z-w)+imag(z-w)*imag(z-w); }
bool check(P z, P w) { return dist(z, w) <= 100; }
struct UnionFind
{
vi data;
UnionFind(int size) : data(size, -1) {}
bool unite(int x, int y){
x = root(x);
y = root(y);
if(x != y){
if(data[y] < data[x]) swap(x, y);
data[x] += data[y];
data[y] = x;
}
return x != y;
}
bool same(int x, int y){ return root(x) == root(y); }
int root(int x){ return data[x] < 0 ? x : data[x] = root(data[x]); }
int size(int x){ return -data[root(x)]; }
};
bool compare(const P& p, const P& q)
{
return p.real() != q.real() ? p.real() < q.real() : p.imag() < q.imag();
}
vector<P> convex_hull(P* ps, int n)
{
sort(ps, ps + n, compare);
int k = 0;
vector<P> qs(n * 2);
rep(i, n){
while(k>1 && det((qs[k-1]-qs[k-2]), (ps[i]-qs[k-1])) <= 0) k--;
qs[k++] = ps[i];
}
int t = k;
rev(i, n-1){
while(k>t && det((qs[k-1]-qs[k-2]), (ps[i]-qs[k-1])) <= 0) k--;
qs[k++] = ps[i];
}
qs.resize(k - 1);
return qs;
}
int main()
{
cin >> n;
rep(i, n){
cin >> x >> y;
z[i] = P(x, y);
}
if(n==0){
puts("1");
return 0;
}
vector<P> pque = convex_hull(z, n);
UnionFind uf(n);
rep(i, pque.size()) rep(j, i) if(check(pque[i], pque[j])) uf.unite(i, j);
int n = pque.size();
if(n == 2){
printf("%.10f\n", 2 + (check(pque[0], pque[1]) ? sqrt(dist(pque[0], pque[1])) : 0));
return 0;
}
int i=0, j=0;
rep(k, n){
if(!compare(pque[i], pque[k])) i = k;
if( compare(pque[j], pque[k])) j = k;
}
int si = i;
int sj = j;
while(i!=sj || j!=si){
maxup(res, dist(pque[i], pque[j]));
if(det(pque[(i+1)%n] - pque[i], pque[(j+1)%n] - pque[j]) < 0) i = (i+1)%n;
else j = (j+1)%n;
}
printf("%.10f\n", sqrt(res) + 2.0);
return 0;
}
imgry22