bzoj 2146: Construct
来源:互联网 发布:园林设计软件有哪些 编辑:程序博客网 时间:2024/06/05 09:37
Description
随着改革开放的深入推进…… 小T家要拆迁了…… 当对未来生活充满美好憧憬的小T看到拆迁协议书的时候,小T从一位大好的社会主义青年变成了绝望的钉子户。 由于小T的家位于市中心,拆迁工作又难以进行,有关部门决定先把小T家用围栏围起来,以免影响市容。考虑到要建设资源节约型社会,他们希望所用的围栏长度越短越好,由于市中心寸土寸金,在围栏长度最短的情况下,围出的多边形面积越小越好。 为了简化问题,我们约定,小T的家是一个多边形,并且每条边与坐标轴平行,围栏构成的也是多边形,每条边与坐标轴平行。
Input
在第一行列出整数n——多边形的顶点的数量。在以下n行中的每一行都有两个整数——沿逆时针方向走过这个多边形顺次所经过的顶点的坐标。边界的任意三个连续顶点不在一条直线上。多边形的边界不含自交和自切。
Output
输出两行,第一行为围栏最短的长度,第二行为长度最短的前提下,最小的面积。
Sample Input
8
0 0
9 0
9 9
6 9
6 3
3 3
3 6
0 6
0 0
9 0
9 9
6 9
6 3
3 3
3 6
0 6
Sample Output
36
63
【数据范围】
对于100%的数据4≤n≤100000,坐标的绝对值不超过109 。
63
【数据范围】
对于100%的数据4≤n≤100000,坐标的绝对值不超过109 。
第一眼看过去,咦这不是裸凸包么。写好了后WA了= =
然后发现是在曼哈顿距离下的凸包
然后就写写写。。分左上左下右上右下四个部分分别求边界。每个部分x y都是单调的
结果一直WA
然后要到了数据,发现错了一个点。。就是图中这个。。
然后我发现我的点没排序。。
然后排序后发现周长算不出了,面积对了= =原来是周长对面积错一个点。
正打算要不要两份合起来的时候时候@PoPoQQQ 告诉我,周长直接框个矩形就好了
然后突然就醒悟了
终于A掉了
【可怕的计算几何】
#include<cmath>#include<cstdio>#include<algorithm>using namespace std;struct point{ long long x,y;}a[100001],b[100001],chs[100001];inline bool cmp1(point x,point y){ if(x.x<y.x) return true; else if(x.x==y.x) if(x.y>y.y) return true; return false; }inline bool cmp2(point x,point y){ if(x.x<y.x) return true; else if(x.x==y.x) if(x.y<y.y) return true; return false; }inline bool cmp3(point x,point y){ if(x.x>y.x) return true; else if(x.x==y.x) if(x.y<y.y) return true; return false; }inline bool cmp4(point x,point y){ if(x.x>y.x) return true; else if(x.x==y.x) if(x.y>y.y) return true; return false; }inline long long absx(long long x){ if(x<0) x=-x; return x;}inline long long dis(point x,point y){ return absx(x.x-y.x)+absx(x.y-y.y);}int main(){// freopen("construct.in","r",stdin);// freopen("construct.out","w",stdout); int n; scanf("%d",&n); int i; long long minx=2100000000,miny=2100000000,maxx=-2100000000,maxy=-2100000000; for(i=1;i<=n;i++) { scanf("%lld%lld",&a[i].x,&a[i].y); minx=min(minx,a[i].x); miny=min(miny,a[i].y); maxx=max(maxx,a[i].x); maxy=max(maxy,a[i].y); b[i].x=a[i].x; b[i].y=a[i].y; } long long ans=maxx-minx+maxy-miny; ans=ans*(long long)2; printf("%lld\n",ans); minx=2100000000; miny=2100000000; int d; for(i=1;i<=n;i++) { if(a[i].x<minx) { minx=a[i].x; miny=a[i].y; d=i; } else if(a[i].x==minx) { if(a[i].y<miny) { miny=a[i].y; d=i; } } } sort(a+1,a+1+n,cmp1); minx=-2100000000; miny=2100000000; for(i=1;i<=n;i++) { if(a[i].y<miny) { miny=a[i].y; minx=a[i].x; d=i; } else if(a[i].y==miny) { if(a[i].x>minx) { minx=a[i].x; d=i; } } } chs[1]=a[1]; int sp=1,k=2; bool flag=0; long long xt=a[1].x,yt=a[1].y; while(k<=d) { if(a[k].x>=chs[sp].x&&a[k].y<=chs[sp].y||sp==0) { sp++; chs[sp].x=a[k].x; chs[sp].y=a[k].y; k++; } else if(a[k].y>chs[sp].y) k++; else if(sp>1) sp--; else k++; } int st=d; i=d; int p=0; while(p<n) { p++; a[p]=b[i]; i=i%n+1; } minx=-2100000000; miny=2100000000; sort(a+1,a+1+n,cmp2); for(i=1;i<=n;i++) { if(a[i].x>minx) { minx=a[i].x; miny=a[i].y; d=i; } else if(a[i].x==minx) { if(a[i].y<miny) { miny=a[i].y; d=i; } } } xt=chs[sp].x; yt=chs[sp].y; k=1; while(k<=d) { if(a[k].x>=chs[sp].x&&a[k].y>=chs[sp].y||sp==0) { sp++; chs[sp].x=a[k].x; chs[sp].y=a[k].y; k++; } else if(a[k].x<chs[sp].x) k++; else sp--; } //下边界 sort(a+1,a+1+n,cmp3); minx=2100000000; miny=-2100000000; for(i=1;i<=n;i++) { if(a[i].y>miny) { miny=a[i].y; minx=a[i].x; d=i; } else if(a[i].y==miny) { if(a[i].x>minx) { minx=a[i].x; d=i; } } } xt=chs[sp].x; yt=chs[sp].y; k=1; while(k<=d) { if(a[k].x<=chs[sp].x&&a[k].y>=chs[sp].y||sp==0) { sp++; chs[sp].x=a[k].x; chs[sp].y=a[k].y; k++; } else if(a[k].y<chs[sp].y) k++; else sp--; } //右边界 sort(a+1,a+1+n,cmp4); minx=2100000000; miny=-2100000000; for(i=2;i<=n;i++) { if(a[i].x<minx) { minx=a[i].x; miny=a[i].y; d=i; } else if(a[i].x==minx) { if(a[i].y<=miny) { miny=a[i].y; d=i; } } } xt=chs[sp].x; yt=chs[sp].y; k=1; while(k<=d) { if(a[k].x<=chs[sp].x&&a[k].y<=chs[sp].y||sp==0) { sp++; chs[sp].x=a[k].x; chs[sp].y=a[k].y; k++; } else if(a[k].x>chs[sp].x) k++; else sp--; } //上边界 左边界 /*long long ans=0; for(i=1;i<=sp-1;i++) ans+=dis(chs[i],chs[i+1]); ans+=dis(chs[1],chs[sp]); printf("%lld\n",ans);*/ ans=0; xt=chs[1].x; yt=chs[1].y; long long lx=0; for(i=2;i<=sp;i++) { if(chs[i].x!=xt&&chs[i].y!=yt) { long long dx=chs[i].x-xt; long long dy=chs[i].y-yt; i--; if(dx>0&&dy>0) { chs[i].x=xt; chs[i].y=chs[i+1].y; } else if(dx>0) { chs[i].x=chs[i+1].x; chs[i].y=yt; } else if(dy>0) { chs[i].x=chs[i+1].x; chs[i].y=yt; } else { chs[i].x=xt; chs[i].y=chs[i+1].y; } i--; } else if(chs[i].x!=xt) { long long dx=chs[i].x-xt; lx+=dx; xt=chs[i].x; } else if(chs[i].y!=yt) { long long dy=chs[i].y-yt; ans+=dy*lx; yt=chs[i].y; } } printf("%lld\n",ans); return 0;}
0 0
- bzoj 2146: Construct
- BZOJ 2146 Construct 计算几何
- construct
- construct function
- construct express
- bzoj2146 Construct
- [BZOJ ]
- BZOJ****-****
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- 苹果取代Windows成为了最脆弱了系统
- Swift UI专项训练1 交互
- 链表、头指针、头结点、第一个结点的区别与联系
- 面向对象的总结(2)
- nyoj16矩形嵌套
- bzoj 2146: Construct
- Handler的基本使用
- 移植5- uboot之tftp启动kernel
- 为什么程序员应该少写代码
- matlab分布式计算平台(多机协作)搭建
- Activity的生命周期
- 防DNF窗口风格
- Java入门到精通——调错篇之Spring2.5利用aspect实现AOP时报错: error at ::0 can't find referenced pointcut XXX
- Reorder List