思路:用位图记录区间已涂上的颜色

#include <iostream>
using namespace std;

#define clr(x) memset(x,0,sizeof(x))
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define MAXN 100002

struct Node{
    int l,r;
    __int64 s;
}nod[MAXN*3];

inline bool single(__int64 a){
    return (((a-2) & a)==0);
}

void init(int tag,int l,int r){
    nod[tag].l=l;
    nod[tag].r=r;
    nod[tag].s=2;
    if(l==r){
        return;
    }
    init(tag*2,l,(l+r)/2);
    init(tag*2+1,(l+r)/2+1,r);
}

void query(int tag,int l,int r,__int64 &ss){
    if(l<=nod[tag].l && nod[tag].r<=r){
        ss|=nod[tag].s;
        return;
    }
    if(single(nod[tag].s)){//若该结点所示区间为单色,则其儿子所示区间也为单色,故无需再查看以该结点为根的树
        ss|=nod[tag].s;
        return;
    }
    if(l<=nod[tag*2].r)
        query(tag*2,l,r,ss);
    if(r>=nod[tag*2+1].l)
        query(tag*2+1,l,r,ss);
}

void paint(int tag,int l,int r,int c){//将[l,r]涂成颜色c
    if(l<=nod[tag].l && nod[tag].r<=r){
        nod[tag].s=(1<<c);
        return;
    }
    if(nod[tag].s==(1<<c))//若该区间已被染成颜色c则无需再染
        return;
    if(single(nod[tag].s)){//若该区间为单色,则在上一次改变中,其儿子没有被改变,又因为需要进入该区间的子树,所以必须先将儿子更新为单色
        nod[tag*2].s=nod[tag].s;
        nod[tag*2+1].s=nod[tag].s;
    }
    if(l<=nod[tag*2].r)
        paint(tag*2,l,r,c);
    if(r>=nod[tag*2+1].l)
        paint(tag*2+1,l,r,c);
    nod[tag].s=nod[tag*2].s|nod[tag*2+1].s;
}

int main(){
    int L,T,O,i,j,x,y,z,cnt;
    char ch[3];
    __int64 ss;
    while(scanf("%d%d%d",&L,&T,&O)!=EOF){
        init(1,1,L);
        for(i=0;i<O;i++){
            scanf("%s",ch);
            if(ch[0]=='C'){
                scanf("%d%d%d",&x,&y,&z);
                if(x>y){
                    int t=x;
                    x=y;
                    y=t;
                }
                paint(1,x,y,z);
            }
            else{
                scanf("%d%d",&x,&y);
                if(x>y){
                    int t=x;
                    x=y;
                    y=t;
                }
                ss=0;
                query(1,x,y,ss);
                cnt=0;
                for(j=1;j<=T;j++){
                    if(ss&(1<<j))
                        cnt++;
                }
                printf("%d\n",cnt);
            }
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/zgmf_x20a/archive/2008/10/16/1312267.html

pku2777 Count Color相关推荐

  1. Count Color poj2777 线段树

    Count Color poj2777 线段树 题意 有一个长木板,现在往上面在一定区间内刷颜色,后来刷的颜色会掩盖掉前面刷的颜色,问每次一定区间内可以看到多少种颜色. 解题思路 这里使用线段树,因为 ...

  2. 数据结构二之线段树Ⅰ——Count Color,Hotel,Transformation,Tree Generator™

    普通的下标线段树 Count Color Hotel Transformation Tree Generator™ Count Color POJ2777 查询区间内颜色种类数,观察到颜色种类数只有3 ...

  3. poj 2777 Count Color(线段树区区+染色问题)

    题目链接:  poj 2777 Count Color 题目大意:  给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C  a  b  c 把区间[a,b]涂为c色,P  a  b 查 ...

  4. POJ 2777 Count Color (线段树区间修改 + 状态压缩)

    题目链接:POJ 2777 Count Color [题目大意] 给你 n 块板子, 编号1--n , 板子的颜色最多30种, 初始时  板子的颜色都是 1: 有两种操作 1 .把给定区间的板子染成一 ...

  5. poj 2777 Count Color

    http://poj.org/problem?id=2777 简单线段树,[成段更新,成段查询]! View Code 1 #include <cstdio> 2 #include < ...

  6. POJ2777 Count Color 线段树区间更新

    题目描写叙述: 长度为L个单位的画板,有T种不同的颜料.现要求按序做O个操作,操作分两种: 1."C A B C",即将A到B之间的区域涂上颜色C 2."P A B&qu ...

  7. Count Color(poj 2777)

    题意: 给一个固定长度为L的画板 有两个操作: C A B C:区间AB内涂上颜色C. P A B:查询区间AB内颜色种类数. 分析:显然是要用线段树来操作的,设定一个sum[]来维护一个区间内的颜色 ...

  8. POJ 2777 - Count Color(线段树区间更新+状态压缩)

    题目链接 https://cn.vjudge.net/problem/POJ-2777 [题意] 有一个长度为 LLL 的区间 [1,L][1,L][1,L] ,有 TTT 种颜色可以涂,有 QQQ ...

  9. 【转载】线段树题目2

    1.hdu1166 敌兵布阵 更新节点,区间求和. 2.hdu1754 I Hate It 更新节点,区间最值. . 3.hdu1698 Just a Hook 成段更新,总区间求和. . 4.hdu ...

最新文章

  1. JS-arguments分析
  2. PHP 7 编译安装开启 libevent 扩展支持
  3. [Tips on Ember 2] 如何尝试 angle-bracket component
  4. 为什么那么多人要学Java?这三个原因告诉你
  5. Ubuntu的网络设置
  6. C语言开发笔记(七)const和指针
  7. 老人言 摘自云风的blog
  8. 电脑注册表怎么清理_笔记本电脑维修|笔记本电脑屏幕怎么清理
  9. 从源码深入理解Spring IoC 注解
  10. Linux 网卡流量查看
  11. 两个苹果手机共享步数_最新刷步教程 | 蚂蚁森林如何快速刷步数,获得296g能量...
  12. dirent struct_读取目录时struct dirent结构体的d_type成员一个小问题
  13. Android转接电话到iPhone,Android迁移数据到iPhone
  14. 互联网装修还有多少机会?
  15. python可以自动运行m文件吗_如何运行m文件而不启动matlab
  16. python画图turtle花开_Python绘图之(5)turtle 画一朵花
  17. Win10怎么卸载有问题的更新补丁
  18. ValueError: Classification metrics can‘t handle a mix of continuous-multioutput and multiclass targe
  19. python 累乘函数_python之函数(二)
  20. 使用for循环打印出一个棱形

热门文章

  1. java对象关系_【java类和对象的关系】
  2. python模块讲解_python中常用模块详解一
  3. 转: 中/英文资料 PKCS #11 函数列表
  4. AnySDK项目实战教程
  5. Zend Framework 简介
  6. Android系统前台进程,可见进程,服务进程,后台进程,空进程的优先级排序
  7. nginx tornado php,tornado+nginx+python 微信公众号接入配置
  8. windows安装多个maven_全网最容易理解的Maven安装、配置、集成演示
  9. 来看一下:构造函数的小秘密详解
  10. meta是什么意思中文_专访 | 从艾希到电子姬,幻刃网络做了款TapTap 8.2分的Meta手游...