bzoj2618: [Cqoi2006]凸多边形

来源:互联网 发布:mysql修改root密码 编辑:程序博客网 时间:2024/05/20 02:55

简述

  半平面交裸题
  一开始因为一个很粗心的问题RE了,这个其实很危险,考场上也不一定能查出来。
  就是sort函数在使用前要定义一个小于号,如果你定义的小于号会使a<b同时b<a可能就会RE,所以一定要避免这类情况。

代码

//半平面交#include <cstdio>#include <algorithm>#include <cmath>#define maxn 500#define eps 1e-8using namespace std;int N, tot;struct point{    double x, y;    point(double x, double y):x(x),y(y){}    point(){}}pt[maxn], _;struct vec{    point pt; double x, y, th;    vec(point pt, double x, double y):pt(pt),x(x),y(y){}    vec(){};}seg[maxn], q[maxn];point operator+(point pt, vec v){return point(pt.x+v.x,pt.y+v.y);}vec operator-(point p1, point p2){return vec(p2,p1.x-p2.x,p1.y-p2.y);}vec operator+(vec v1, vec v2){return vec(_,v1.x+v2.x,v1.y+v2.y);}vec operator-(vec v1, vec v2){return vec(_,v1.x-v2.x,v1.y-v2.y);}double operator*(vec v1, vec v2){return v1.x*v2.y-v2.x*v1.y;}vec operator*(vec v, double t){return vec(_,v.x*t,v.y*t);}bool in(point p, vec v){return (p-v.pt)*v<-eps;}bool operator<(const vec &v1, const vec &v2){return fabs(v1.th-v2.th)<eps?in(v1.pt,v2):v1.th<v2.th;}point inter(vec v1, vec v2){    vec u=v1.pt-v2.pt; double t=v2*u/(v1*v2);    return v1.pt+v1*t;}void init(){    int x[100], y[100], i, j, n, m;    scanf("%d",&n);    for(i=1;i<=n;i++)    {        scanf("%d",&m);        for(j=0;j<m;j++)scanf("%d%d",x+j,y+j);        for(j=0;j<m;j++)seg[++tot]=point(x[(j+1)%m],y[(j+1)%m])-point(x[j],y[j]);    }}void hpi(){    int l, r, i, x;    for(i=1;i<=tot;i++)seg[i].th=atan2(seg[i].y,seg[i].x);    sort(seg+1,seg+tot+1);    for(x=1,i=2;i<=tot;i++)if(fabs(seg[i].th-seg[i-1].th)>eps)seg[++x]=seg[i];tot=x;    for(q[l=r=1]=seg[1],i=2;i<=tot;i++)    {        while(l<r and !in(inter(q[r],q[r-1]),seg[i]))r--;        while(l<r and !in(inter(q[l],q[l+1]),seg[i]))l++;        q[++r]=seg[i];    }    while(l<r and !in(inter(q[r],q[r-1]),q[l]))r--;    while(l<r and !in(inter(q[l],q[l+1]),q[r]))l++;    pt[tot=1]=inter(q[r],q[l]);    for(i=l;i<r;i++)pt[++tot]=inter(q[i],q[i+1]);}void calc(){    double S=0.0;    int i;    for(i=3;i<=tot;i++)S+=(pt[i]-pt[1])*(pt[i-1]-pt[1]);    printf("%.3lf",fabs(S)/2);}int main(){    init();    hpi();    calc();    return 0;}
0 0
原创粉丝点击