您的位置:首页 > 其它

[BZOJ 1913][Apio2010]signaling 信号覆盖:计算几何

2017-05-03 15:30 169 查看
点击这里查看原题

思维好题,具体还是看http://blog.csdn.net/qpswwww/article/details/45334033的吧

/*
User:Small
Language:C++
Problem No.:1913
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
const int M=1505;
const double pi=acos(-1);
int n;
ll ans;
double ang[M<<1];
struct no{
int x,y;
}p[M];
ll c(int n,int m){
ll a=1,b=1;
for(int i=0;i<m;i++){
a*=(n-i);
b*=(m-i);
}
return a/b;
}
void solve(int x){
int tot,t,pp;
ll res=0;
tot=t=0;
pp=1;
for(int i=1;i<=n;i++)
if(i!=x) ang[++tot]=atan2(p[i].y-p[x].y,p[i].x-p[x].x);
sort(ang+1,ang+tot+1);
t=tot;
for(int i=1;i<=t;i++) ang[++tot]=ang[i]+2*pi;//把所有角复制一遍
for(int i=1;i<=t;i++){
while(pp<=tot&&ang[pp]<ang[i]+pi) pp++;
res+=c(pp-i-1,2);
}
ans+=c(t,3)-res;
}
int main(){
freopen("data.in","r",stdin);//
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
for(int i=1;i<=n;i++) solve(i);
printf("%.6lf\n",1.0*(ans+2*(c(n,4)-ans))/c(n,3)+3);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: