poj_2777线段树+位运算

第一次没想到用位运算,不出意料的T了,,,

PS:在床上呆了接近两个月后,我胡汉三又杀回来刷题啦~~

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=100004;
using namespace std;
int sum[maxn<<2];
int col[maxn<<2];
void pushDown(int rt)
{
    if(sum[rt]){
    col[rt<<1]=col[rt<<1|1]=1<<(sum[rt]-1);
    sum[rt<<1]=sum[rt<<1|1]=sum[rt];
    sum[rt]=0;
    }
}
void update(int c,int L,int R,int l,int r,int rt)
{
    if(l>=L&&R>=r)
    {
        sum[rt]=c;
        col[rt]=1<<(sum[rt]-1);
       // cout<<rt<<"##"<<col[rt]<<endl;
        return;
    }
    if(L>r||R<l)
        return ;
    if(sum[rt])
    pushDown(rt);
    int m=(l+r)>>1;
    if(m>=L) update(c,L,R,lson);
    if(m<R) update(c,L,R,rson);
    col[rt]=col[rt<<1]|col[rt<<1|1];
}
int query(int L,int R,int l,int r,int rt)
{
    if(L<=l&&r<=R)
    {
        return col[rt];
    }
    if(L>r||R<l)
        return 0;
    pushDown(rt);
    int m=(l+r)>>1;
    return query(L,R,lson)|query(L,R,rson);
    /*if(m>=L) query(L,R,lson);
    if(m<R) query(L,R,rson);
    return col[rt<<1]|col[rt<<1|1];*/
}
int main()
{
    int l,t,o;
    while(scanf("%d%d%d",&l,&t,&o)!=EOF)
    {
        getchar();
        char p;
        int a,b,c;
        sum[1]=1;col[1]=1;
        for(int i=0; i<o; i++)
        {
            scanf("%c",&p);
            getchar();
            if(p=='P')
            {
                scanf("%d%d",&a,&b);
                if(a>b)
                {
                    int x=a;a=b;b=x;
                }
                getchar();
                int tem=query(a,b,1,l,1);
                int ans=0;
                //cout<<tem<<"tem"<<endl;
                while(tem)
                {
                    ans+=tem&1;
                    tem>>=1;
                }
                printf("%d\n",ans);
            }
            else
            {
                scanf("%d%d%d",&a,&b,&c);
                 if(a>b)
                {
                    int x=a;a=b;b=x;
                }
                getchar();
                update(c,a,b,1,l,1);
                //cout<<col[2]<<"update"<<endl;
            }
        }
    }
    return 0;
}

posted @ 2014-11-02 12:22  JarvisLau  阅读(154)  评论(0编辑  收藏  举报