日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

老oj1965:polygon半平面交

發布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 老oj1965:polygon半平面交 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:http://192.168.2.240:8080/JudgeOnline/showproblem?problem_id=1965

?

polygon半平面交

Time Limit:1000MS? Memory Limit:165536K
Total Submit:66 Accepted:25?
Case Time Limit:100MS

Description

?

Input

n為半平面個數,以下n行表示若干半平面。形式如ax+by+c<=0?

Output

輸出半平面交的面積。保留3位小數?
保證面積有限。?
有多組數據:?

Sample Input

?

4 1 0 -1 0 1 -1 -1 0 -1 0 -1 -1

?

Sample Output

?

4.000 數據保證:N<=10000 半平面交出的多邊形的坐標在10^10以內。

?

Source

計算幾何 半平面交

?

半平面交裸題。

講道理不是說好保留三位小數嗎,TMD數據全是保留到整數……幸好我WA了一次之后看了看數據,不然不知道要改多久……機智如我

?

1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 #define inf 1e10 7 #define maxn 10010 8 using namespace std; 9 int n,head,tail,tot,cnt; 10 double ans; 11 const double eps=1e-15; 12 struct point{double x,y;}p[maxn]; 13 point operator +(point x,point y){return (point){x.x+y.x,x.y+y.y};} 14 point operator -(point x,point y){return (point){x.x-y.x,x.y-y.y};} 15 struct line{double ang,a,b,c;point pt;}li[maxn],que[maxn]; 16 double dot(point a,point b){return a.x*b.x+a.y*b.y;} 17 double cross(point x,point y,point z){return (x.x-z.x)*(y.y-z.y)-(x.y-z.y)*(y.x-z.x);} 18 bool includ(line x,point y){return y.x*x.a+y.y*x.b+x.c<=eps;} 19 bool comp(line x,line y){ 20 if(x.ang==y.ang)return includ(y,x.pt); 21 return x.ang<y.ang; 22 } 23 point calc(line s1,line s2){ 24 double v1=s1.b*s2.c-s1.c*s2.b,v2=s1.c*s2.a-s1.a*s2.c; 25 double v0=s1.a*s2.b-s1.b*s2.a; 26 return (point){v1/v0,v2/v0}; 27 } 28 bool check(line x,line y,line z){return !includ(z,calc(x,y));} 29 bool solve(){ 30 head=1;tail=0; 31 for(int i=1;i<=tot;i++){ 32 if(i>1&&fabs(li[i].ang-li[i-1].ang)<=eps)continue; 33 while(head<tail&&check(que[tail-1],que[tail],li[i]))tail--; 34 while(head<tail&&check(que[head],que[head+1],li[i]))head++; 35 que[++tail]=li[i]; 36 } 37 while(head<tail&&check(que[tail-1],que[tail],que[head]))tail--; 38 while(head<tail&&check(que[head],que[head+1],que[tail]))head++; 39 for(int i=head;i<tail;i++)p[++cnt]=calc(que[i],que[i+1]); 40 p[++cnt]=calc(que[head],que[tail]); 41 p[cnt+1]=p[1]; 42 } 43 void getans(){ 44 ans=0;for(int i=1;i<=cnt;i++)ans+=cross(p[i],p[i+1],(point){0,0});ans=fabs(ans)/2; 45 } 46 int main(){ 47 //freopen("polygon.in","r",stdin); 48 //freopen("polygon.out","w",stdout); 49 scanf("%d",&n); 50 for(int i=1;i<=n;i++){ 51 double x,y,z; 52 scanf("%lf%lf%lf",&x,&y,&z); 53 li[++tot].a=x;li[tot].b=y;li[tot].c=z; 54 } 55 ++tot,li[tot].a=-1,li[tot].b=0,li[tot].c=-inf; 56 ++tot,li[tot].a=1,li[tot].b=0,li[tot].c=-inf; 57 ++tot,li[tot].a=0,li[tot].b=-1,li[tot].c=-inf; 58 ++tot,li[tot].a=0,li[tot].b=1,li[tot].c=-inf; 59 for(int i=1;i<=tot;i++){ 60 li[i].ang=atan2(li[i].b,li[i].a); 61 if(li[i].b) li[i].pt=(point){0,-li[i].c/li[i].b}; 62 else li[i].pt=(point){-li[i].c/li[i].a,0}; 63 } 64 sort(li+1,li+tot+1,comp); 65 solve();getans(); 66 printf("%.0lf\n",ans); 67 return 0; 68 } View Code

?

轉載于:https://www.cnblogs.com/longshengblog/p/5741592.html

總結

以上是生活随笔為你收集整理的老oj1965:polygon半平面交的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。