zoukankan      html  css  js  c++  java
  • CF 333E 计算几何+bitset优化

    http://codeforces.com/contest/333/problem/E


    题意:3000个点,选三个组成三角形,输出最长的最短边  的一半


    思路:枚举边,对边排序,之后维护每个点连接的点,如果枚举到某一条边发现对应两个点的集合有交集,说明这条边可以作为一个三角形的最短边(因为排序过,连接的肯定都     比当前枚举的边长)

       当然这里使用Bitset来维护点集,优化复杂度。


    代码:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    struct node{
        int u,v,w;
        node(){};
        node(int a,int b,int c):u(a),v(b),w(c){};
    }arr[3050*3050/2];
    
    bool operator <(const node &a,const node &b){
        return a.w>b.w;
    }
    
    int dis(pair<int,int> p1,pair<int,int> p2){
        return (p1.first-p2.first)*(p1.first-p2.first)+(p1.second-p2.second)*(p1.second-p2.second);
    }
    
    int n;
    pair<int,int> P[3050];
    bitset<3005> B[3005];
    
    int main(){
        scanf("%d",&n);
        int a,b;
        for(int i=0;i<n;i++){
            scanf("%d%d",&a,&b);
            P[i]=make_pair(a,b);
        }
        int cnt=0;
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                arr[cnt++]=node(i,j,dis(P[i],P[j]));
            }
        }
        sort(arr,arr+cnt);
        int ans;
        for(int i=0;i<cnt;i++){
            bitset<3005> tmp=B[arr[i].v]&B[arr[i].u];
            if(tmp.any()){
                ans=arr[i].w;
                break;
            }
            B[arr[i].u].set(arr[i].v);
            B[arr[i].v].set(arr[i].u);
        }
        printf("%.7f
    ",sqrt((double)ans)/2);
        return 0;
    }
    

  • 相关阅读:
    css盒子模型 ( 基本针对兼容性问题有点帮助 )
    11.5 Array 数组
    11.5笔记 数组去重
    11.5笔记 函数
    11..2笔记 对象
    11.1笔记
    10.31笔记
    10.31笔记 作用域链
    10.15笔记 js
    10.8补
  • 原文地址:https://www.cnblogs.com/zhangxianlong/p/10672534.html
Copyright © 2011-2022 走看看