矩形周长并 poj 1177Picture/hdu 1828
来源:互联网 发布:网络策划是电商 编辑:程序博客网 时间:2024/06/01 10:50
同上篇一样,具体的去看论文吧
我没看过论文,不知道正解,但是我的代码能够A提,这就足够了
分两个方向分别扫一边
bug:
1.先处理入边,在处理出边
2.线段树query函数注意一下(代码种有标记)
#include <iostream>#include <cstdio>#include <algorithm>using namespace std;#define mid (L+R>>1)#define lson L,mid,P<<1#define rson mid,R,P<<1|1const int M = 10010;class segtree{public: int left[M<<2],right[M<<2]; int sum[M<<2],num[M<<2],s[M],n; void init(int ss[],int k){ n=0; for(int i=0;i<k;i++){ if(i==0||s[n]!=ss[i]){ s[++n]=ss[i]; } } __build(1,n,1); } void __build(int L,int R,int P){ left[P]=s[L],right[P]=s[R]; num[P]=0,sum[P]=0; if(L+1==R)return ; __build(lson); __build(rson); } void pushup(int x,int L,int R){ if(num[x]){ sum[x]=right[x]-left[x]; }else{ if(L+1!=R){ sum[x]=sum[x<<1]+sum[x<<1|1]; }else{ sum[x]=0; } } } void __update(int L,int R,int P,int l,int r,int f){ if(l==left[P]&&r==right[P]){ num[P]+=f; pushup(P,L,R); return ; } if(l<right[P<<1]){ __update(lson,l,min(right[P<<1],r),f); } if(r>right[P<<1]){ __update(rson,max(l,right[P<<1]),r,f); } pushup(P,L,R); } int __query(int L,int R,int P,int l,int r){ if(sum[P]==right[P]-left[P]){//注意细节 return r-l; } if(l==left[P]&&r==right[P]){ return sum[P]; } int ret=0; if(l<right[P<<1]){ ret+=__query(lson,l,min(r,right[P<<1])); } if(r>right[P<<1]){ ret+=__query(rson,max(l,right[P<<1]),r); } return ret; } void update(int l,int r,int f){__update(1,n,1,l,r,f);} int query(int l,int r){return __query(1,n,1,l,r);}};struct Line{ int x,y1,y2,f; void set(int _x,int _y1,int _y2,int _f){ x=_x,y1=_y1,y2=_y2,f=_f; }}ll[M<<1],rr[M<<1];int xx[M<<1],yy[M<<1],n;bool cmp(Line a,Line b){ if(a.x!=b.x){ return a.x<b.x; }else{ return a.f>b.f; }}int main(){ while(cin>>n){ segtree *tree; tree = new segtree; for(int i=0,x1,y1,x2,y2;i<n;i++){ scanf("%d%d%d%d",&x1,&y1,&x2,&y2); ll[i<<1].set(x1,y1,y2,1); ll[i<<1|1].set(x2,y1,y2,-1); rr[i<<1].set(y1,x1,x2,1); rr[i<<1|1].set(y2,x1,x2,-1); yy[i<<1]=y1,yy[i<<1|1]=y2; xx[i<<1]=x1,xx[i<<1|1]=x2; } sort(ll,ll+n*2,cmp); sort(yy,yy+n*2); tree->init(yy,n*2); int sum=ll[0].y2-ll[0].y1; tree->update(ll[0].y1,ll[0].y2,ll[0].f); for(int i=1;i<n*2;i++){ if(ll[i].f==1){ sum+=(ll[i].y2-ll[i].y1-tree->query(ll[i].y1,ll[i].y2)); tree->update(ll[i].y1,ll[i].y2,ll[i].f); }else{ tree->update(ll[i].y1,ll[i].y2,ll[i].f); sum+=(ll[i].y2-ll[i].y1-tree->query(ll[i].y1,ll[i].y2)); } } delete tree; tree = new segtree; sort(rr,rr+n*2,cmp); sort(xx,xx+n*2); tree->init(xx,n*2); sum+=rr[0].y2-rr[0].y1; tree->update(rr[0].y1,rr[0].y2,rr[0].f); for(int i=1;i<n*2;i++){ if(rr[i].f==1){ sum+=(rr[i].y2-rr[i].y1-tree->query(rr[i].y1,rr[i].y2)); tree->update(rr[i].y1,rr[i].y2,rr[i].f); }else{ tree->update(rr[i].y1,rr[i].y2,rr[i].f); sum+=(rr[i].y2-rr[i].y1-tree->query(rr[i].y1,rr[i].y2)); } } cout<<sum<<endl; delete tree; } return 0;}
0 0
- poj 1177 / hdu 1828 Picture 矩形周长并
- 矩形周长并 poj 1177Picture/hdu 1828
- POJ 1177 Picture 矩形周长并
- hdu 1828 Picture(矩形周长并)
- HDU 1828 Picture(矩形周长并)
- 矩形周长并 hdu 1828 Picture
- HDU 1828 / POJ 1177 Picture --线段树求矩形周长并
- poj 1177 & hdu 1828 矩形周长并
- hdu 1828 poj 1177 picture 求周长并
- 求矩形并的周长 poj 1177 picture
- poj 1177 Picture(线段树求矩形周长并)
- poj 1177 Picture(线段树+矩形周长并)
- poj 1177 Picture(扫描线+矩形周长并)
- POJ 1177 Picture(矩形并的周长)
- Hdu 1828 Picture 线段树+矩形周长并
- hdu 1828 Picture 线段树 矩形周长并
- hdu 1828 / poj/pku 1177(Picture)(线段树求矩形覆盖面周长)
- HDOJ-1828 Picture(矩形周长并)
- poj 3714 Raid(最近点对)
- java 获取汉字拼音的首字母 .
- Java实现MD5算法(原来有这么强大的功能)
- 控制台显示打印sql中的具体参数
- Linux 查看进程PS命令详细介绍
- 矩形周长并 poj 1177Picture/hdu 1828
- 大一,下学期,课表。。表。。表。。。表。。。
- C/C++ Volatile关键词深度剖析
- java 发送邮件 email相关操作代码测试,生成复杂格式邮件,发送邮件相关操作(键人岐)
- 歌手大赛
- linear regression
- 企业邮件营销着陆页的神奇用途
- 枚举类型实例
- string构造函数原理