线段树区间更新poj2777

来源:互联网 发布:vm mac 硬件加速 编辑:程序博客网 时间:2024/05/17 23:43

这个题跟poj2528贴海报是一样的。

#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<queue>#include<stack>#include<map>#include<set>#include<algorithm>using namespace std;const int maxn=100010;int L,T,O;set<int> s;struct IntervalTree{    int setv[maxn<<3];    void build(int o,int l,int r)    {        setv[o]=1;        if(l==r)return ;        int mid=(l+r)>>1;        build(o<<1,l,mid);        build(o<<1|1,mid+1,r);    }    void pushdown(int o)    {        if(setv[o]>0)        {            setv[o<<1]=setv[o<<1|1]=setv[o];            setv[o]=-1;        }    }    void update(int o,int l,int r,int q1,int q2,int x)    {        if(q1<=l&&r<=q2)        {            setv[o]=x;            return ;        }        pushdown(o);        int mid=(l+r)>>1;        if(q1<=mid)update(o<<1,l,mid,q1,q2,x);        if(q2>mid)update(o<<1|1,mid+1,r,q1,q2,x);    }    void query(int o,int l,int r,int q1,int q2)    {        if(setv[o]>0)        {            s.insert(setv[o]);            return;        }        if(l==r)return;        int mid=(l+r)>>1;        if(q1<=mid)query(o<<1,l,mid,q1,q2);        if(q2>mid)query(o<<1|1,mid+1,r,q1,q2);    }}tree;int main(){    freopen("in.txt","r",stdin);    char op[5];    int a,b,c;    while(scanf("%d%d%d",&L,&T,&O)!=EOF)    {        tree.build(1,1,L);        while(O--)        {            scanf("%s",op);            if(op[0]=='C')            {                scanf("%d%d%d",&a,&b,&c);                tree.update(1,1,L,a,b,c);            }            else            {                s.clear();                scanf("%d%d",&a,&b);                tree.query(1,1,L,a,b);                int ans=s.size();                printf("%d\n",ans);            }        }    }    return 0;}


0 0
原创粉丝点击