【POJ1177】【HDU1828】【codevs2149】矩形面积周长并
来源:互联网 发布:软件的硬件要求 编辑:程序博客网 时间:2024/05/20 05:22
传送门1
传送门2
传送门3
思路:
有点纸张的做法
不会记录竖向边的个数
于是横着做一遍扫描线,竖着做一遍扫描线
好像还挺正确的……
但实际上可以通过当前扫到的横向边的类型来记录竖向边的个数
唉:-(……
代码:
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#define M 5005using namespace std;int n;int b[M<<1],cover[M<<3],lazy[M<<3];struct node{ int up,down,data,tp;}a[M<<1],c[M<<1];bool cmp(node a,node b){ if (a.data==b.data) return a.tp>b.tp; return a.data<b.data;}void update(int rt,int begin,int end,node x){ if (x.up<=begin&&end<=x.down) { lazy[rt]+=x.tp; if (lazy[rt]) cover[rt]=b[end+1]-b[begin]; else if (begin==end) cover[rt]=0; else cover[rt]=cover[rt<<1]+cover[rt<<1|1]; return; } int mid=begin+end>>1; if (mid>=x.up) update(rt<<1,begin,mid,x); if (mid<x.down) update(rt<<1|1,mid+1,end,x); if (lazy[rt]) cover[rt]=b[end+1]-b[begin]; else cover[rt]=cover[rt<<1]+cover[rt<<1|1];}int get(int rt,int begin,int end,node x){ if (x.up<=begin&&end<=x.down) return cover[rt]; if (cover[rt]==b[end+1]-b[begin]) return b[min(end,x.down)+1]-b[max(begin,x.up)]; int mid=begin+end>>1,ans=0; if (mid>=x.up) ans+=get(rt<<1,begin,mid,x); if (mid<x.down) ans+=get(rt<<1|1,mid+1,end,x); return ans; }main(){ scanf("%d",&n); int x,y,xx,yy; for (int i=1;i<=n;++i) scanf("%d%d%d%d",&x,&y,&xx,&yy), b[i*2-1]=y,b[i*2]=yy, a[i*2-1]=(node){y,yy,x,1}, a[i*2]=(node){y,yy,xx,-1}, c[i*2-1]=(node){x,xx,y,1}, c[i*2]=(node){x,xx,yy,-1}; sort(b+1,b+n*2+1); b[0]=unique(b+1,b+n*2+1)-b-1; for (int i=1;i<=n;++i) a[i*2-1].up=a[i*2].up=lower_bound(b+1,b+b[0]+1,a[i*2-1].up)-b, a[i*2-1].down=a[i*2].down=lower_bound(b+1,b+b[0]+1,a[i*2-1].down)-b-1; sort(a+1,a+n*2+1,cmp); int t=a[1].data,ans=0; for (int i=1;i<=n<<1;++i) { if (a[i].tp==1) ans+=b[a[i].down+1]-b[a[i].up]-get(1,1,b[0]-1,a[i]), update(1,1,b[0]-1,a[i]); else update(1,1,b[0]-1,a[i]), ans+=b[a[i].down+1]-b[a[i].up]-get(1,1,b[0]-1,a[i]); t=a[i].data; } for (int i=1;i<=n;++i) a[i*2-1]=c[i*2-1], a[i*2]=c[i*2], b[i*2-1]=a[i*2-1].up, b[i*2]=a[i*2].down; sort(b+1,b+n*2+1); b[0]=unique(b+1,b+n*2+1)-b-1; for (int i=1;i<=n;++i) a[i*2-1].up=a[i*2].up=lower_bound(b+1,b+b[0]+1,a[i*2-1].up)-b, a[i*2-1].down=a[i*2].down=lower_bound(b+1,b+b[0]+1,a[i*2-1].down)-b-1; sort(a+1,a+n*2+1,cmp); t=a[1].data; for (int i=1;i<=n<<1;++i) { if (a[i].tp==1) ans+=b[a[i].down+1]-b[a[i].up]-get(1,1,b[0]-1,a[i]), update(1,1,b[0]-1,a[i]); else update(1,1,b[0]-1,a[i]), ans+=b[a[i].down+1]-b[a[i].up]-get(1,1,b[0]-1,a[i]); t=a[i].data; } printf("%d\n",ans);}
0 0
- 【POJ1177】【HDU1828】【codevs2149】矩形面积周长并
- POJ1177 HDU1828 Picture,线段树求矩形并周长
- hdu1828 矩形周长并
- hdu1828&poj1177(线段树求矩形交周长,扫描线)
- Poj1177(求矩形并的轮廓周长)
- hdu1828&&51nod1206(矩形周长并)
- hdu1828[扫描线矩形周长并]
- 【HDU1828】Picture【线段树】【矩形周长并】
- hdu1828 线段树扫描线求矩形面积的周长
- 矩形 面积并 && 周长并
- POJ1177矩形面积并(矩形切割+括号匹配)
- poj1177 Picture 扫描线求矩形周长并
- 【poj1177】Picture(矩形周长并+线段树+扫描线)
- hdu1828 Picture(扫描线+矩形周长并+线段树)
- hdu1828 Picture (矩形周长并+扫描线)
- hdu1828 Picture(线段树+扫描线+矩形周长并)
- hdu 1828、poj1177求矩形周长并 线段树 扫描线
- poj1177[IOI1998]Picture (扫描线+离散化+线段树,求矩形周长并)
- SDUTACM 3-5 学生成绩统计
- git stash (保存当前的工作现场)
- PAT 02-线性结构2 一元多项式的乘法与加法运算 (java)
- Bugly升级SDK适配Android N
- SSH Action使用ModelDriver实现最简单的增册改查
- 【POJ1177】【HDU1828】【codevs2149】矩形面积周长并
- spring_(1)学习
- Python字典
- 我的Android开发环境--Linux Mint
- Python 基础回顾(二)
- Hive 中数据库表的分区建议
- linux下使用c语言访问mySql数据库
- 文件系统显示用户名和路径
- 15. 3Sum M