【bzoj1132】 [POI2008]Tro
2017-07-25 00:06
302 查看
Description
平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000Input
第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10000]Output
保留一位小数,误差不超过0.1Sample Input
50 0
1 2
0 2
1 0
1 1
Sample Output
7.0Solve
先按水平序排序,然后枚举一个点,按极角序排序,在枚举一个点,用叉积算面积
#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; }
相关文章推荐
- 【bzoj1132】[POI2008] Tro
- BZOJ 1132: [POI2008]Tro|计算几何
- BZOJ_1132_[POI2008]Tro_计算几何
- bzoj1132 [POI2008]Tro 计算几何
- 【BZOJ1132】【POI2008】Tro 计算几何 叉积求面积
- BZOJ 1132 [POI2008]Tro 计算几何
- 【BZOJ】1132: [POI2008]Tro
- bzoj 1132: [POI2008]Tro
- bzoj1132: [POI2008]Tro (第二次做)
- 【BZOJ1132】【POI2008】Tro 计算几何 叉积求面积
- bzoj1132: [POI2008]Tro
- 【POI2008】【BZOJ1132】Tro
- BZOJ1132: [POI2008]Tro
- [BZOJ1132][POI2008]Tro(计算几何)
- BZOJ1132: [POI2008]Tro
- BZOJ 1132: [POI2008]Tro
- BZOJ1132: [POI2008]Tro
- bzoj 1132: [POI2008]Tro (计算几何)
- BZOJ 1132: [POI2008]Tro 计算几何,统计对答案贡献
- BZOJ 1132 [POI2008]Tro(极角排序)