博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P4196 [CQOI2006]凸多边形
阅读量:5817 次
发布时间:2019-06-18

本文共 2023 字,大约阅读时间需要 6 分钟。

半平面交的

然而这个代码真的是非常的迷……并不怎么看得懂……

//minamoto#include
#define fp(i,a,b) for(register int i=a,I=b+1;i
I;--i)using namespace std;const int N=1e5+5;const double eps=1e-9;inline int dcmp(const double &a){return fabs(a)>=eps?a<0?-1:1:0;}struct node{double x,y;}pt[N];int tot;inline node operator -(node a,node b){return {a.x-b.x,a.y-b.y};}inline double operator *(node a,node b){return a.x*b.y-a.y*b.x;}struct line{node a,b;}p[N],dq[N];int tp,bt,n;inline bool aboveX(line a){ if(!dcmp(a.b.y-a.a.y))return dcmp(a.b.x-a.a.x)>0; return dcmp(a.b.y-a.a.y)>0;}inline bool cmp(line a,line b){ if(aboveX(a)!=aboveX(b))return aboveX(a); if(!dcmp((a.b-a.a)*(b.b-b.a)))return dcmp((a.b-a.a)*(b.b-a.a))<0; return dcmp((a.b-a.a)*(b.b-b.a))>0;}inline node get(line a,line b){ double a1=a.b.y-a.a.y,b1=a.a.x-a.b.x,c1=a.a*a.b; double a2=b.b.y-b.a.y,b2=b.a.x-b.b.x,c2=b.a*b.b; double d=a1*b2-a2*b1; return {(b2*c1-b1*c2)/d,(a1*c2-a2*c1)/d};}inline bool pd(line a,line b,line c){ node p=get(a,b); return dcmp((p-c.a)*(c.b-c.a))>-1;}void solve(){ tot=1; fp(i,1,n)if(dcmp((p[i].b-p[i].a)*(p[tot].b-p[tot].a)))p[++tot]=p[i]; n=tot,dq[bt=1]=p[1],dq[tp=2]=p[2]; fp(i,3,n){ while(tp>bt&&pd(dq[tp],dq[tp-1],p[i]))--tp; while(tp>bt&&pd(dq[bt],dq[bt+1],p[i]))++bt; dq[++tp]=p[i]; } while(tp>bt&&pd(dq[tp],dq[tp-1],dq[bt]))--tp; while(tp>bt&&pd(dq[bt],dq[bt+1],dq[tp]))++bt; dq[++tp]=dq[bt],tot=0; fp(i,bt,tp-1)pt[++tot]=get(dq[i],dq[i+1]);}double area(double s=0){ if(tot<3)return 0;pt[++tot]=pt[1]; fp(i,1,tot-1)s+=pt[i]*pt[i+1]; return 0.5*fabs(s);}int main(){// freopen("testdata.in","r",stdin); int T;scanf("%d",&T); while(T--){ int ps;scanf("%d",&ps); fp(i,1,ps)scanf("%lf%lf",&pt[i].x,&pt[i].y); pt[0]=pt[ps]; fp(i,0,ps-1)p[++n].a=pt[i],p[n].b=pt[i+1]; } sort(p+1,p+1+n,cmp); solve();double ans=area();printf("%.3lf\n",ans);return 0;}

转载于:https://www.cnblogs.com/bztMinamoto/p/10026542.html

你可能感兴趣的文章
Flask 源码流程,上下文管理
查看>>
stream classdesc serialVersionUID = -7218828885279815404, local class serialVersionUID = 1.
查看>>
ZAB与Paxos算法的联系与区别
查看>>
java 读取本地的json文件
查看>>
Breaking parallel loops in .NET C# using the Stop method z
查看>>
Android Content Provider Guides
查看>>
修改故障转移群集心跳时间
查看>>
[轉]redis;mongodb;memcache三者的性能比較
查看>>
微软职位内部推荐-Sr DEV
查看>>
用计算器计算“异或CRC”
查看>>
让你的WPF程序在Win7下呈现Win8风格主题
查看>>
深刻理解C#的传值调用和传引用调用
查看>>
Windows环境配置Apache+Mysql+PHP
查看>>
JDBC二查询(web基础学习笔记八)
查看>>
监听器(web基础学习笔记二十二)
查看>>
802.11 学习笔记
查看>>
Leetcode-Database-176-Second Highest Salary-Easy(转)
查看>>
Ubuntu12.04LTS安装好后是空白桌面的解决步骤(更新显卡驱动)
查看>>
poj-3696 The Luckiest number
查看>>
[Dynamic Language] Python定时任务框架
查看>>