标签:
解题报告
题意:
对线段染色。询问线段区间的颜色种数。
思路:
本来直接在线段树上染色,lz标记颜色。每次查询的话訪问线段树,求出颜色种数。结果超时了,最坏的情况下,染色能够染到叶子节点。
换成存下区间的颜色种数,这样每次查询就不用找到叶子节点了。用按位或来处理颜色种数。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int sum[500000],lz[500000],ans;
void push_down(int rt,int l,int r)
{
    if(lz[rt])
    {
        lz[rt<<1]=lz[rt<<1|1]=lz[rt];
        sum[rt<<1]=lz[rt];
        sum[rt<<1|1]=lz[rt];
        lz[rt]=0;
    }
}
void push_up(int rt,int l,int r)
{
    sum[rt]=sum[rt<<1]|sum[rt<<1|1];
}
void cbtree(int rt,int l,int r)
{
    if(l==r)
    {
        sum[rt]=1;
        return ;
    }
    int mid=(l+r)>>1;
    cbtree(rt<<1,l,mid);
    cbtree(rt<<1|1,mid+1,r);
    push_up(rt,l,r);
}
void update(int rt,int l,int r,int ql,int qr,int v)
{
    if(ql>r||qr<l)return ;
    if(ql<=l&&r<=qr)
    {
        lz[rt]=v;
        sum[rt]=v;
        return ;
    }
    int mid=(l+r)>>1;
    push_down(rt,l,r);
    update(rt<<1,l,mid,ql,qr,v);
    update(rt<<1|1,mid+1,r,ql,qr,v);
    push_up(rt,l,r);
}
int _q(int rt,int l,int r,int ql,int qr)
{
    if(ql>r||qr<l)return 0;
    if(ql<=l&&r<=qr)
    {
        return sum[rt];
    }
    push_down(rt,l,r);
    int mid=(l+r)>>1;
    return _q(rt<<1,l,mid,ql,qr) | _q(rt<<1|1,mid+1,r,ql,qr);
}
int main()
{
    int n,t,q,ql,qr,i,j,a,k;
    char str[10];
    scanf("%d%d%d",&n,&t,&q);
    cbtree(1,1,n);
    while(q--)
    {
        scanf("%s",str);
        if(str[0]=='C')
        {
            scanf("%d%d%d",&ql,&qr,&a);
            if(ql>qr)swap(ql,qr);
            update(1,1,n,ql,qr,1<<(a-1));
        }
        else
        {
            scanf("%d%d",&ql,&qr);
            if(ql>qr)swap(ql,qr);
            ans=_q(1,1,n,ql,qr);
            int cnt=0;
            while(ans)
            {
                if(ans%2)
                    cnt++;
                ans/=2;
            }
            printf("%d\n",cnt);
        }
    }
    return 0;
}
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 35143 | Accepted: 10591 | 
Description
Input
Output
Sample Input
2 2 4 C 1 1 2 P 1 2 C 2 2 2 P 1 2
Sample Output
2 1
POJ训练计划2777_Count Color(线段树/成段更新/区间染色)
标签:
原文地址:http://www.cnblogs.com/bhlsheji/p/5316476.html