Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198184
  • 博文数量: 67
  • 博客积分: 2970
  • 博客等级: 少校
  • 技术积分: 685
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-23 11:36
文章分类

全部博文(67)

文章存档

2012年(2)

2011年(19)

2010年(46)

我的朋友

分类: C/C++

2010-09-23 22:20:16

 

#include<stdio.h>
#include<algorithm>
using namespace std;

const int MAX=100000;
int L,T,O;
int tree[MAX*3];    //每个结点表示其对应区间段的颜色


void update(int node,int l,int r,int lc,int rc,int newValue)
{
    if(l==lc&&r==rc)
    {
        tree[node]=newValue;
        return;
    }

    if(tree[node]>0)    //自上向下更新结点

    {
        tree[node<<1]=tree[(node<<1)+1]=tree[node];
        tree[node]=0;
    }
    
    int middle=(l+r)>>1;
    if(middle<lc) update((node<<1)+1,middle+1,r,lc,rc,newValue);
    else if(middle>=rc) update(node<<1,l,middle,lc,rc,newValue);
    else
    {
        update(node<<1,l,middle,lc,middle,newValue);
        update((node<<1)+1,middle+1,r,middle+1,rc,newValue);
    }
}

void inquire(int node,int l,int r,int lc,int rc,int &value)
{
    if(tree[node]&&l==lc&&r==rc)                                
    {
        value|=1<<tree[node];
        return ;
    }

    if(tree[node]>0) tree[node<<1]=tree[(node<<1)+1]=tree[node];    //更新深入


    int middle=(l+r)>>1;
    if(middle<lc) inquire((node<<1)+1,middle+1,r,lc,rc,value);
    else if(middle>=rc) inquire(node<<1,l,middle,lc,rc,value);
    else
    {
        inquire(node<<1,l,middle,lc,middle,value);
        inquire((node<<1)+1,middle+1,r,middle+1,rc,value);
    }
}

int convertSum(int &value)    //提取颜色

{
    int sum=0;
    for(int i=1;i<=30;i++) if(value&(1<<i)) sum++;
    return sum;
}

int main()
{
    scanf("%d%d%d",&L,&T,&O);
    tree[1]=1;

    int a,b,c;
    char str[2];
    for(int i=0;i<O;i++)
    {
        scanf("%s",str);
        if(str[0]=='C')
        {
            scanf("%d%d%d",&a,&b,&c);
            if(a>b) swap(a,b);
            update(1,1,L,a,b,c);
        }
        else
        {
            scanf("%d%d",&a,&b);
            if(a>b) swap(a,b);
            c=0;
            inquire(1,1,L,a,b,c);
            printf("%d\n",convertSum(c));
        }
    }
    return 0;
}


 

阅读(989) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~