您的位置:首页 > 其它

【bzoj1132】 [POI2008]Tro

2017-07-25 00:06 302 查看

Description

平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000

Input

第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10000]

Output

保留一位小数,误差不超过0.1

Sample Input

5

0 0

1 2

0 2

1 0

1 1

Sample Output

7.0

Solve

先按水平序排序,然后枚举一个点,按极角序排序,在枚举一个点,用叉积算面积
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
const int N=3005;
struct node{
int x,y;
friend bool operator < (node i,node j){
return (i.y==j.y)?(i.x<j.x):(i.y<j.y);
}
}p
,sor
,s;
int n;
long long sx,sy,ans;
inline bool cmp(node i,node j){
return ((i.x-s.x)*(j.y-s.y)-(i.y-s.y)*(j.x-s.x))>0;
}
int main (){
scanf ("%d",&n);
for (int i=1;i<=n;++i)
scanf ("%d%d",&p[i].x,&p[i].y);
sort(p+1,p+n+1);
for (int i=1;i<=n;++i){
s=p[i];
for (int j=i+1;j<=n;++j){
sor[j].x=p[j].x;
sor[j].y=p[j].y;
}
sort(sor+i+1,sor+n+1,cmp);
sor[i]=p[i];
sx=sy=0;
for (int j=i+1;j<=n;++j){
sx+=sor[j].x;
sy+=sor[j].y;
}
for (int j=i+1;j<=n;++j){
sx-=sor[j].x;
sy-=sor[j].y;
ans+=((long long)sor[i].x*sor[j].y-(long long)sor[i].y*sor[j].x)*(n-j)
+sx*(sor[i].y-sor[j].y)
+sy*(sor[j].x-sor[i].x);
}
}
if (ans&1)printf ("%lld.5",(ans>>1));
else printf ("%lld.0",(ans>>1));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: