NC110113 Summer Earnings(bitset)

圆的半径就是三角形中最短边的一半

因此我们枚举所有的边,从大到小维护bitset

如果对于当前边的两点,已经有一个点与他们相连,那么说明这条边就是答案

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
typedef pair<int,int> pll;
const int N=9e6+10;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
struct node{
    int x,y;
}s[3010];
bitset<3010> bt[3010];
ll get(int i,int j){
    return (s[i].x-s[j].x)*(s[i].x-s[j].x)+(s[i].y-s[j].y)*(s[i].y-s[j].y);
}
struct SQ{
    ll dis;
    int x,y;
}e[N];
int cnt;
bool cmp(SQ a,SQ b){
    return a.dis>b.dis;
}
int main(){
    //ios::sync_with_stdio(false);
    int n;
    cin>>n;
    int i;
    for(i=1;i<=n;i++){
        cin>>s[i].x>>s[i].y;
    }
    for(i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            ll dis=get(i,j);
            e[++cnt]={dis,i,j};
        }
    }
    sort(e+1,e+1+cnt,cmp);
    for(i=1;i<=cnt;i++){
        bitset<3010> tmp=bt[e[i].x]&bt[e[i].y];
        if(tmp.count()){
            printf("%.7f
",sqrt(e[i].dis)/2.0);
            return 0;
        }
        bt[e[i].x][e[i].y]=1;
        bt[e[i].y][e[i].x]=1;
    }
    return 0;
}
View Code
没有人不辛苦,只有人不喊疼
原文地址:https://www.cnblogs.com/ctyakwf/p/14540887.html