Codeforces 333E Summer Earnings(bitset)

题目链接 Summer Earnings

类似MST_Kruskal的做法,连边后sort。

然后对于每条边,依次处理下来,当发现存在三角形时即停止。(具体细节见代码)

答案即为发现三角形时当前所在边长度的一半。

#include <bits/stdc++.h>

using namespace std;

struct node{
    int x, y, z;
    friend bool operator < (const node &a, const node &b){
        return a.z > b.z;
    }
} p[4600010];

int a[3010], b[3010];
int n, cnt = 0;

bitset <3010> c[3010], tmp;

int main(){

    scanf("%d", &n);

    for (int i = 1; i <= n; ++i) scanf("%d%d", a + i, b + i);
    for (int i = 1; i <= n - 1; ++i) for (int j = i + 1; j <= n; ++j)
        p[++cnt].x = i, p[cnt].y = j, 
        p[cnt].z = (a[i] - a[j]) * (a[i] - a[j]) + (b[i] - b[j]) * (b[i] - b[j]);

    sort(p + 1, p + cnt + 1);

    for (int i = 1; i <= cnt; ++i){
        int x = p[i].x, y = p[i].y;
        tmp = c[x] & c[y];
        if (tmp.any()) return 0 * printf("%.10f\n", sqrt(1.00 * p[i].z) / 2);
        c[x].set(y), c[y].set(x);
    }    


    return 0;

}

 

posted @ 2017-04-16 22:13  cxhscst2  阅读(282)  评论(0编辑  收藏  举报