线段树 矩形并周长 picture
来源:互联网 发布:银行市场份额数据 编辑:程序博客网 时间:2024/06/06 01:17
线段树 我还是首推胡浩大牛的博客http://www.notonlysuccess.com/
线段树中扫描线一直是我比较吃力的一种题。矩形面积并,周长并,特别是周长并,一直无法解决,想不明白,现在终于做出来一个周长并的题目了, 是不是我的线段树水平又有了一点提高呢?
代码不长,写起来老麻烦了!
周长并与面积并不同的是,周长并需要记录竖着的边的情况。也就是说,需要记录边的合并问题,代码中分别使用lbd和rbd记录是否有边,如果合并的都有边,那么,合并之后的竖着的边的总数就要减2.
#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define N 10010struct note{ int a,b,h,s; note(){} note(int l,int r,int c,int d):a(l) , b(r) , h(c) , s(d) {}}data[N];///线段树#define lson l ,m ,rt<<1#define rson m+1,r,rt<<1|1#define fmid (l+r)>>1#define M 22222int len[M<<2],memseg[M<<2],lbd[M<<2],rbd[M<<2],cnt[M<<2];void Push_up(int rt,int l,int r){ if(cnt[rt]) { lbd[rt] = rbd[rt] = 1; memseg[rt] = 2; len[rt] = r-l+1; }else if(l == r) lbd[rt] = rbd[rt] = memseg[rt] = len[rt] = 0; else { lbd[rt] = lbd[rt<<1]; rbd[rt] = rbd[rt<<1|1]; len[rt] = len[rt<<1] + len[rt<<1|1]; memseg[rt] = memseg[rt<<1] + memseg[rt<<1|1]; if(rbd[rt<<1] && lbd[rt<<1|1] ) memseg[rt] -= 2; }}/***矩形有个特点,已经出现的更新,必然会再次出现,这样的话,延迟标记也就可以不用push_down()!*/void update(int lx,int rx,int s,int l,int r,int rt){ if(lx <= l && rx >= r) { cnt[rt] += s; Push_up(rt,l,r); return; } int m = fmid; if(lx <= m) update(lx,rx,s,lson); if(m < rx) update(lx,rx,s,rson); Push_up(rt,l,r);}//////////////////////////////////////bool cmp(const note a,const note b){ return a.h < b.h || (a.h == b.h && a.s < b.s); ///?????排序的时候可以不对s进行比较}int main(){ int n; while(~scanf("%d",&n)) { int x,y,xx,yy; int ll = 10000,rr = -10000; int m = 0; for(int i = 0;i < n;i++) { scanf("%d%d%d%d",&x,&y,&xx,&yy); ll = min(ll,x); rr = max(rr,xx); data[m++] = note(x,xx,y,1); data[m++] = note(x,xx,yy,-1); } sort(data,data+m,cmp); data[m].h = data[m-1].h; int ret = 0,last = 0; for(int i = 0;i < m;i++) { if(data[i].a != data[i].b) update(data[i].a ,data[i].b-1,data[i].s,ll,rr,1); ret += abs(len[1] - last); ret += memseg[1] * (data[i+1].h - data[i].h); last = len[1]; } printf("%d\n",ret); } return 0;}
- 线段树 矩形并周长 picture
- 【HDU1828】Picture【线段树】【矩形周长并】
- poj 1177 Picture(线段树求矩形周长并)
- POJ1177 HDU1828 Picture,线段树求矩形并周长
- hdu1828 Picture(扫描线+矩形周长并+线段树)
- Hdu 1828 Picture 线段树+矩形周长并
- poj 1177 Picture(线段树+矩形周长并)
- hdu 1828 Picture 线段树 矩形周长并
- 【poj1177】Picture(矩形周长并+线段树+扫描线)
- hdu1828 Picture(线段树+扫描线+矩形周长并)
- HUD 1828 Picture 矩形周长/线段树
- hdu 1828 Picture(线段树扫描线矩形周长并)
- HDU 1828 / POJ 1177 Picture --线段树求矩形周长并
- poj-1177 Picture(矩形周长并,线段树+扫描线)
- poj1177[IOI1998]Picture (扫描线+离散化+线段树,求矩形周长并)
- POJ-1177 Picture (线段树 求矩形周长)
- hdu1828Picture(线段树求矩形周长并)
- POJ 1177 Picture 矩形周长并
- Activex、OLE、COM、OCX、DLL之间有什么区别?(转载学习)
- 服务器数据库系列 - 解析nginx负载均衡
- What's stdcall, cdecl, etc....
- Tomcat的目录结构及其用途
- Dialog创建流程源码解析
- 线段树 矩形并周长 picture
- 微软为Windows8平板所配备的键鼠套装
- SVD分解的应用——矩阵运算和文本处理中的分类问题
- NGUI研究院合集(五合一) 雨松的文章。。。。
- URLEncoder.encode、URLDecoder.decode、escape、encodeURI、encodeURIComponent
- Effective C++ 总结
- Undefined function 'Nz' in expression.
- android之PopUpWindow使用实例
- [转]爸爸和无我编程十条诫律