题目链接:  poj 2777 Count Color

题目大意:  给出一块长度为n的板,区间范围[1,n],和m种染料

k次操作,C  a  b  c 把区间[a,b]涂为c色,P  a  b 查询区间[a,b]有多少种不同颜色

解题思路:  很明显的线段树的区间插入和区间查询,但是如何统计有多少不同的颜色呢?

如果每个结点数组来存储颜色的种类,空间复杂度很高,而且查询很慢

颜色最多只有30种,可以用位运算中的“按位或|”

颜色也用二进制来处理,和存储:

第一种颜色的二进制表示1

第二种颜色的二进制表示10

第三种颜色的二进制表示100

第四种颜色的二进制表示1000

如同一个区间出现第一种和第三种颜色,按位或运算之后得到 101

统计结果有多少个1,就说明区间有多少不同的颜色

线段树每个结点存储区间颜色的种类,结点=左子树|右子树

更多关于线段树的解题报告可以看我博客 myzee.cn

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 110000
#define MID(a,b) (a+b)>>1
#define L(a) a<<1
#define R(a) (a<<1|1)
typedef struct{int left,right;int add,num;
}Node;
Node Tree[MAX<<2];
int Color[32]={0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824};//二进制表示第几种颜色,如8表示第四种颜色:1000
int Lowbit(int x)   //剔除x二进制中最后面一个1
{return x&(-x);
}void Build(int t,int l,int r)  //以1为根结点,建立[l,r]的线段树
{Tree[t].left=l,Tree[t].right=r,Tree[t].add=0;  //***if(l==r){Tree[t].num=1;return ;}int mid=MID(Tree[t].left,Tree[t].right);Build(L(t),l,mid);Build(R(t),mid+1,r);Tree[t].num=(Tree[L(t)].num|Tree[R(t)].num);
}void Insert(int t,int l,int r,int m)  //向区间[l,r]涂颜色
{if(Tree[t].left==l&&Tree[t].right==r){Tree[t].add=m;Tree[t].num=m;return ;}if(Tree[t].add!=0)  //lazy标记{Tree[L(t)].num=Tree[t].add;Tree[R(t)].num=Tree[t].add;Tree[L(t)].add=Tree[t].add;Tree[R(t)].add=Tree[t].add;Tree[t].add=0;}int mid=MID(Tree[t].left,Tree[t].right);if(l>mid){Insert(R(t),l,r,m);}else if(r<=mid){Insert(L(t),l,r,m);}else{Insert(L(t),l,mid,m);Insert(R(t),mid+1,r,m);}Tree[t].num=(Tree[L(t)].num|Tree[R(t)].num); //***
}int Query(int t,int l,int r)
{if(Tree[t].left==l&&Tree[t].right==r){return Tree[t].num;}if(Tree[t].add!=0)  //区间插入的lazy思想{Tree[L(t)].num=Tree[t].add;Tree[R(t)].num=Tree[t].add;Tree[L(t)].add=Tree[t].add;Tree[R(t)].add=Tree[t].add;Tree[t].add=0;}int mid=MID(Tree[t].left,Tree[t].right);if(l>mid){return Query(R(t),l,r);}else if(r<=mid){return Query(L(t),l,r);}else{return Query(L(t),l,mid)|Query(R(t),mid+1,r);   //***是|,不是+!!!}Tree[t].num=(Tree[L(t)].num|Tree[R(t)].num);
}int main()
{char ch;int n,col,q,i,k,a,b,c;int m;while(scanf("%d%d%d",&n,&col,&q)!=EOF){memset(Tree,0,sizeof(Tree)); //初始化Build(1,1,n);                //建树for(i=0;i<q;i++){getchar();scanf("%c",&ch);if(ch=='P'){scanf("%d%d",&a,&b);k=0;if(a>b)m=Query(1,b,a);elsem=Query(1,a,b);while(m>0)    //计算查询后的结果的二进制表示右多少个1{k++;m-=Lowbit(m);}printf("%d\n",k);}else{scanf("%d%d%d",&a,&b,&c);if(a>b)Insert(1,b,a,Color[c]);elseInsert(1,a,b,Color[c]);}}}return 0;
}

注:原创文章,转载请注明出处

poj 2777 Count Color(线段树区区+染色问题)相关推荐

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

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

  2. poj 2777 Count Color

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

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

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

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

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

  5. 线段树区间染色 浮水法 学习小记 Poj 2777 + Poj 2528

    复习过的东西必须时常拿来练练,虽说都是水题.... Poj 2777 典型的区间染色问题,貌似我的写法为了不数组越界必须多开一倍的数组空间.....还没有想到解决方法,有机会参考一下别人的写法. Po ...

  6. poj 2777(线段树+区间染色)

    解题思路:这道题利用了线段树+位运算的思想,由于颜色的种类只有30种,所以int可以存下来,所以我们在线段树的节点里面加上status的状态信息,表示这段区间内的颜色信息,而且我们可以知道,父节点的s ...

  7. poj 3468 A Simple Problem with Integers(线段树区区)

    题目链接:  http://poj.org/problem?id=3468 题目大意:  给出N个数,和M次查询 C a b c  区间[a,b]的值都加上c Q a b     查询区间[a,b]值 ...

  8. poj 2528 线段树离散化+染色

    题目链接 Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 92628 Accepted: 2645 ...

  9. POJ Mayor's posters——线段树+离散化

    原文:http://blog.163.com/cuiqiongjie@126/blog/static/85642734201261151553308/ 大致题意: 有一面墙,被等分为1QW份,一份的宽 ...

最新文章

  1. CSS实现跨浏览器兼容性的盒阴影效果
  2. Java计算两个时间差
  3. wordpress hmailserver等相关 3
  4. 机器学习笔记(三)线性模型
  5. python 阿里云短信接口_阿里云短信PythonSDK的用法
  6. 织梦php echo 调用金币,dedecms实现任意页面调用当前会员信息的方法
  7. MyBatis之使用resultMap实现高级映射
  8. linux下的文件系统,Linux根文件系统(“/”文件系统)下的目录介绍
  9. 有关javabean的说法不正确的是_7、关于JavaBean,下列叙述中不正确的是
  10. Python入门--列表元素的判断及遍历,判断指定元素在列表中是否存在,列表元素的遍历,
  11. 深圳90后小伙拿到14所国外名牌大学offer
  12. xshell连接虚拟机
  13. javascript对象的浅拷贝、深拷贝和Object.assign方法浅析
  14. linux 3 4文件管理ppt,第8单元-Linux系统文件查找与文件管理.ppt
  15. C#——NPOI对Excel的操作、导入导出时异常处理(二)
  16. 使用Eclipse Memory Analyzer分析Tomcat内存溢出
  17. 计算机考试记不住题目,驾考科目一口诀,科一题目太多记不住?快来看看这些技巧...
  18. Java项目:(小程序)物业管理系统(spring+spring mvc+mybatis+layui+微信小程)
  19. 抑郁症维持期治疗应维持多久?如何管理患者发生停药反应的风险?
  20. moment.js获取当天,本周,当月,当季,近n天开始结束时间

热门文章

  1. PhpStorm 的基本应用
  2. h5页面嵌入android app时遇到的问题
  3. 深入php面向对象和模式
  4. TcxComboBox控件说明
  5. [转]粤语发音字典-粤语翻译
  6. MediaPlay播放Stream时出现error 38等错误的原因
  7. powerdesigner2
  8. 北大教授郑也夫斗胆谈了7个天大的问题,每个都非常狠,也很现实
  9. 牛逼,Java中表达式引擎工具就用它!建议收藏,一定用的到!!
  10. fastjson的作者,在阿里内网挨骂了?!