poj2528Mayor's posters(线段树)
来源:互联网 发布:哈鲁留学怎么样 知乎 编辑:程序博客网 时间:2024/05/29 12:36
最近在学线段树,发现线段树太高深了,很难理解,于是乎,就先找了几道比较基础的线段树题做,基本上都是模板题,就当背模板吧,然而写起来也并非那么简单,各种错误,各种bug,调了很久,最后艰难的ac,poj2528此题根本没有什么卡点,就是需要离散化一下,离散化,也是从大牛们那借鉴学习来的,从昨天晚上开始,到今天,勉强有个初步的认识了。。。。。。。。。。。。。。。
还是描述一下题意吧:
有一面墙,被等分为1QW份,一份的宽度为一个单位宽度。现在往墙上贴N张海报,每张海报的宽度是任意的,但是必定是单位宽度的整数倍,且<=1QW。后贴的海报若与先贴的海报有交集,后贴的海报必定会全部或局部覆盖先贴的海报。现在给出每张海报所贴的位置(左端位置和右端位置),问张贴完N张海报后,还能看见多少张海报?(PS:看见一部分也算看到。)
下面贴上代码一份,仅供参考。。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define debug(s) cout<<(s)<<endl;using namespace std;const int maxn = 20100;struct line_tree{ int left,right; int vs;//which is visible}tree[maxn<<3];bool vis[40005];int res,ep[40005];int reg[10010][2];unsigned short dis[10000000+1];void build(int l,int r,int i){ tree[i].left=l; tree[i].right=r; tree[i].vs=0; if(l==r)return; int mid = (l+r)>>1; build(l,mid,i<<1); build(mid+1,r,(i<<1)+1); return ;}void update(int s,int t,int o,int v){ if(s>tree[o].right||t<tree[o].left)return ; if(s<=tree[o].left&&t>=tree[o].right){ //debug(o) tree[o].vs=v; return; } if(tree[o].vs>=0){ tree[o<<1].vs=tree[(o<<1)+1].vs=tree[o].vs; tree[o].vs=-1; } //if(tree[o].left==tree[o].right)return; update(s,t,o<<1,v); update(s,t,(o<<1)+1,v);}void Count(int o){ if(tree[o].vs>0){ if(!vis[tree[o].vs]){ res++; vis[tree[o].vs]=1; } return ; } if(tree[o].left==tree[o].right)return; if(tree[o].vs==-1){ Count(o<<1); Count((o<<1)+1); } return ;}int main(){ int t; scanf("%d",&t); while(t--){ int n,cnt=0,Maxp; scanf("%d",&n); memset(dis,0,sizeof(dis)); for(int i=1;i<=n;i++){ scanf("%d%d",®[i][0],®[i][1]); if(dis[reg[i][0]]==0){ ep[cnt++]=reg[i][0]; dis[reg[i][0]]=1; } if(dis[reg[i][1]]==0){ ep[cnt++]=reg[i][1]; dis[reg[i][1]]=1; } } sort(ep,ep+cnt); unsigned short hsh=0; for(int i=0;i<cnt;i++)dis[ep[i]]=++hsh; Maxp = hsh; build(1,Maxp,1); for(int i=1;i<=n;i++){ //debug(dis[reg[i][0]]) //debug(dis[reg[i][1]]) update(dis[reg[i][0]],dis[reg[i][1]],1,i); } //for(int i=1;i<=15;i++)debug(tree[i].vs) res=0; memset(vis,0,sizeof(vis)); Count(1); printf("%d\n",res); } return 0;}
0 0
- poj2528Mayor's posters(线段树)
- poj2528Mayor's posters【线段树+离散化】
- poj2528Mayor's posters(线段树+离散化)
- poj2528Mayor's posters【离散化+线段树】
- POJ2528Mayor's posters(线段树插线问线)
- poj2528Mayor's posters(线段树+离散化+坑坑坑)
- poj2528Mayor's posters 离散化+线段树区间更新
- 离散化坐标然后线段树解poj2528Mayor's posters
- poj2528Mayor's posters【离散化线段树区间更新】
- POJ2528Mayor's posters
- poj2528Mayor's posters
- poj2528Mayor's posters(线段树+二分查找+离散化,查找用map函数记录是否重复)
- POJ2528 Mayor's posters(线段树)
- Mayor's posters--------线段树
- Mayor's posters(POJ2528)(线段树+离散化)
- pku 2528 Mayor's posters(线段树)
- 【POJ2528】Mayor's posters ||【NYOJ9】 (线段树)
- POJ 2528 Mayor's posters (线段树+离散化)
- 二叉搜索树的性质与操作
- POJ3264
- Visible Lattice Points poj+欧拉函数的应用+水水的过了
- 中国剩余定理
- Dividing coins - UVa 562 dp背包
- poj2528Mayor's posters(线段树)
- 对libevent+多线程服务器模型的C++封装类
- uva 11167 网络流 【好题】
- 从某道C面试题开始……
- PorterDuff.Mode
- 判断输入的任意整数m是否为素数。
- Graph Automata Player
- java 内省机制
- Maven仓库汇总