您的位置:首页 > 其它

BZOJ1132 [POI2008]Tro

2017-02-28 20:00 267 查看
首先叉积有分配率……

然后我们可以先把所有点按水平序排一下,然后枚举三角形的一个点,然后剩下的点求个前缀和即可

然后把这个点删了

因为按水平序排过来所用符号不会出问题

#include<iostream>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<cstdlib>
#include<cstdio>
#include<map>
#include<bitset>
#include<set>
#include<stack>
#include<vector>
#include<queue>
using namespace std;
#define MAXN 3010
#define MAXM 1010
#define ll long long
#define eps 1e-8
#define MOD 1000000007
#define INF 1000000000
struct pt{
ll x;
ll y;
double ang;
pt(){

}
pt(int _x,int _y){
x=_x;
y=_y;
}
friend pt operator +(pt x,pt y){
return pt(x.x+y.x,x.y+y.y);
}
friend pt operator -(pt x,pt y){
return pt(x.x-y.x,x.y-y.y);
}
friend ll operator *(pt x,pt y){
return x.x*y.y-x.y*y.x;
}
friend bool operator <(pt x,pt y){
return x.ang<y.ang;
}
};
int n;
pt a[MAXN],b[MAXN];
int tot;
ll ans;
bool cmp(pt x,pt y){
return x.x!=y.x?x.x<y.x:x.y<y.y;
}
int main(){
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%lld%lld",&a[i].x,&a[i].y);
}
sort(a+1,a+n+1,cmp);
for(i=1;i<=n;i++){
tot=0;
for(j=i+1;j<=n;j++){
b[++tot]=a[j]-a[i];
b[tot].ang=atan2((a[j]-a[i]).y,(a[j]-a[i]).x);
}
sort(b+1,b+tot+1);
pt sum(0,0);
for(j=1;j<=tot;j++){
ans+=sum*b[j];
sum=sum+b[j];
}
}
printf("%lld",ans>>1);
if(ans&1){
printf(".5\n");
}else{
printf(".0\n");
}
return 0;
}

/*

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: