首页 > 代码库 > BZOJ1132: [POI2008]Tro

BZOJ1132: [POI2008]Tro

1132: [POI2008]Tro

Time Limit: 20 Sec  Memory Limit: 162 MB
Submit: 815  Solved: 211
[Submit][Status]

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

HINT

Source

题解:

这题我们每次以最左边的点为原点,将其它点按照极角排序(极角我想就是某点与原点连线的斜率),

然后按标号枚举另一个点,利用叉积求面积,并且用部分和来优化。

实数果然有精度问题。。记得/的时候要把数据强制转化为你需要的类型,否则做的就是整型除法。

代码:

 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<iostream> 7 #include<vector> 8 #include<map> 9 #include<set>10 #include<queue>11 #include<string>12 #define inf 100000000013 #define maxn 3000+50014 #define maxm 500+10015 #define eps 1e-1016 #define ll long long17 #define pa pair<int,int>18 #define for0(i,n) for(int i=0;i<=(n);i++)19 #define for1(i,n) for(int i=1;i<=(n);i++)20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)22 using namespace std;23 inline int read()24 {25     int x=0,f=1;char ch=getchar();26     while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}27     while(ch>=0&&ch<=9){x=10*x+ch-0;ch=getchar();}28     return x*f;29 }30 int n;31 struct rec{ll x,y;double z;}a[maxn];32 inline double kk(rec a,rec b)33 {34     if(b.x==a.x)35     {36         if(b.y<a.y)return -inf;else return inf;37     }38     return (double)(b.y-a.y)/(double)(b.x-a.x);39 }40 inline bool cmp(rec a,rec b)41 {42     return a.z<b.z;43 }44 int main()45 {46     freopen("input.txt","r",stdin);47     freopen("output.txt","w",stdout);48     n=read();49     for1(i,n)a[i].x=read(),a[i].y=read();50     ll ans=0;51     for1(i,n-2)52     {53       int k=i;    54       for2(j,i+1,n)if(a[j].x<a[k].x)k=j;55       swap(a[k],a[i]);56       for2(j,i+1,n)a[j].z=kk(a[i],a[j]);57       sort(a+i+1,a+n+1,cmp);    58       ll xx=0,yy=0;59       for2(j,i+1,n)60         {61           ans+=(a[j].x-a[i].x)*yy-(a[j].y-a[i].y)*xx;62           xx+=a[j].x-a[i].x;yy+=a[j].y-a[i].y;63               //cout<<ans<<‘ ‘<<xx<<‘ ‘<<yy<<‘ ‘<<a[j].x<<‘ ‘<<a[j].y<<‘ ‘<<a[j].z<<endl;64         }              65     }    66     printf("%lld",abs(ans)/2);67     if(ans&1)puts(".5");else puts(".0");68     return 0;69 }
View Code

 

BZOJ1132: [POI2008]Tro