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",&reg[i][0],&reg[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
原创粉丝点击