线段树区间更新+poj2528

来源:互联网 发布:华为云 和阿里云哪个好 编辑:程序博客网 时间:2024/06/06 19:29

题意:贴海报,问能看见几张

思路:离散化一下,然后就可以做了

#include<iostream>#include<cstdio>#include<cstring>#include<set>#include<algorithm>using namespace std;const int maxn=11010;int X[maxn*3];int l[maxn],r[maxn],n;set<int> s;struct IntevalTree{    int setv[maxn<<4];    void init(){memset(setv,-1,sizeof(setv));}    void pushdown(int o,int l,int r)    {        if(setv[o]!=-1)        {            setv[o*2]=setv[o*2+1]=setv[o];            setv[o]=-1;        }    }    void update(int o,int l,int r,int flag,int q1,int q2)    {        if(q1<=l&&q2>=r)        {            setv[o]=flag;            return ;        }        pushdown(o,l,r);        int mid=(l+r)/2;        if(q1<=mid)update(o*2,l,mid,flag,q1,q2);        if(q2>mid)update(o*2+1,mid+1,r,flag,q1,q2);    }    void query(int o,int l,int r)    {       if(setv[o]!=-1)       {           s.insert(setv[o]);           return;       }       if(l==r)return;       int mid=(l+r)/2;       query(o*2,l,mid);       query(o*2+1,mid+1,r);    }}tree;int main(){    //freopen("in.txt","r",stdin);    int t;    scanf("%d",&t);    while(t--)    {        int nx=0;        scanf("%d",&n);        for(int i=1;i<=n;i++)        {            scanf("%d%d",&l[i],&r[i]);            X[nx++]=l[i];            X[nx++]=r[i];        }        sort(X,X+nx);int m=1;        nx=unique(X,X+nx)-X;        tree.init();        for(int i=1;i<=n;i++)        {            int x=lower_bound(X,X+nx,l[i])-X;            int y=lower_bound(X,X+nx,r[i])-X;            tree.update(1,0,nx-1,i-1,x,y);        }        s.clear();        tree.query(1,0,nx-1);        printf("%d\n",s.size());    }    return 0;}


0 0