首页 > 代码库 > BZOJ1132: [POI2008]Tro
BZOJ1132: [POI2008]Tro
1132: [POI2008]Tro
Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 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
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 }
BZOJ1132: [POI2008]Tro
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。