poj 2777

来源:互联网 发布:unity3d 编辑:程序博客网 时间:2024/05/20 17:40

题目:http://poj.org/problem?id=2777

线段树。线段覆盖+lazy标记。处理查询的时候要注意。不要查询到最下面的子树,不然会超时


下面是AC代码:

#include<cstdio>#include<cstring>#include<set>#include<algorithm>using namespace std;const int maxn = 100000+10;#define lson id<<1,l,m#define rson id<<1|1,m+1,rstruct node{    int l,r;    int color;}T[maxn<<2];void build(int id,int l,int r){    T[id].l=l;T[id].r=r; T[id].color=-1;    if(l==r) return ;    int m=(l+r)>>1;    build(lson);  build(rson);}void update(int id,int l,int r,int color){    if(T[id].l>=l&&T[id].r<=r){        T[id].color=color;        return ;    }     if(T[id].color!=-1){         T[id<<1].color=T[id<<1|1].color=T[id].color;         T[id].color=-1;     }     int m=(T[id].l+T[id].r)>>1;     if(m>=r)       update(id<<1,l,r,color);     else if(m<l)   update(id<<1|1,l,r,color);     else{              update(lson,color);              update(rson,color);     }}int ans[40];void  query(int id,int l,int r){    if(T[id].color!=-1){        ans[ T[id].color ] = 1; return ;    }    int m=(T[id].l+T[id].r)>>1;    if(m>=r)     query(id<<1,l,r);    else if(l>m) query(id<<1|1,l,r);    else {        query(id<<1,l,m);        query(id<<1|1,m+1,r);    }}int main(){    int l,t,o;    char op[100];    while(scanf("%d%d%d",&l,&t,&o)!=EOF){          build(1,1,l);          update(1,1,l,1);          for(int i=0;i<o;i++){              scanf("%s",op);              int left,right,color;              if(op[0]=='C'){                 scanf("%d%d%d",&left,&right,&color);                 if(left>right) swap(left,right);                 update(1,left,right,color);              }              else{                  scanf("%d%d",&left,&right);                  if(left>right) swap(left,right);                  memset(ans,0,sizeof(ans));                  query(1,left,right);                  int res=0;                  for(int i=1;i<=30;i++) if(ans[i]>0) res++;                  printf("%d\n",res++);              }          }    }    return 0;}