E. Summer Earnings
就是碰见三个圆或者四个圆的时候就想一下怎么用其他的东西等价一下啊。。。
#include<stdio.h> #include<algorithm> #include<string.h> #include<bitset> #include<math.h> using namespace std; struct node1 { int x,y,id; }s[4000]; struct node { int a,b,w; }G[10000000]; bitset<4000>vis[4000]; int dis(int a,int b) { int res=0; res+=(s[a].x-s[b].x)*(s[a].x-s[b].x); res+=(s[a].y-s[b].y)*(s[a].y-s[b].y); return res; } bool cmp(node x,node y) { return x.w>y.w; } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&s[i].x,&s[i].y); s[i].id=i; } int cnt=0; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { G[++cnt].w=dis(i,j); G[cnt].a=s[i].id; G[cnt].b=s[j].id; } } int ans=0; sort(G+1,G+1+cnt,cmp); for(int i=1;i<=cnt;i++) { int a=G[i].a,b=G[i].b; bitset<4000> temp; temp=vis[a]&vis[b]; if(temp.any()) { ans=G[i].w; break; } vis[a].set(b); vis[b].set(a); } printf("%lf\n",sqrt(ans)/2); }