发现自己越来越傻逼了。一道傻逼题搞了一晚上一直超时,凭啥子就我不能过???

然后发现cin没关stdio同步。。。


Description

Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem.

There is a very long board with length L centimeter, L is a positive integer, so we can evenly divide the board into L segments, and they are labeled by 1, 2, ... L from left to right, each is 1 centimeter long. Now we have to color the board - one segment with only one color. We can do following two operations on the board:

  1. "C A B C" Color the board from segment A to segment B with color C.
  2. "P A B" Output the number of different colors painted between segment A and segment B (including).

In our daily life, we have very few words to describe a color (red, green, blue, yellow…), so you may assume that the total number of different colors T is very small. To make it simple, we express the names of colors as color 1, color 2, ... color T. At the beginning, the board was painted in color 1. Now the rest of problem is left to your.

Input

First line of input contains L (1 <= L <= 100000), T (1 <= T <= 30) and O (1 <= O <= 100000). Here O denotes the number of operations. Following O lines, each contains "C A B C" or "P A B" (here A, B, C are integers, and A may be larger than B) as an operation defined previously.

Output

Ouput results of the output operation in order, each line contains a number.

Sample Input

2 2 4

C 1 1 2

P 1 2

C 2 2 2

P 1 2

Sample Output

2

1


题目大意

给你一根小木棍,最开始颜色为 1, 然后有两种操作: 将某一段区间全染成某种颜色,或者询问某一个区间共有几种颜色。

题解

因为 颜色最多只有30种, 所以可以用一个int来存某个颜色是否出现,向上更新是直接 | (或) 一下就好了。最后枚举一下答案中共出现了几种颜色。

Ps:cin 卡一晚上我不服啊,辣鸡题,毁我青春233

代码

#include <iostream>
using namespace std;
#define ls u<<1,l,mid
#define rs u<<1|1,mid+1,r
#define pushup(u) {nod[u] = nod[u<<1] | nod[u<<1|1];}
#define pushdown(u) {add[u<<1] = add[u<<1|1] = add[u];nod[u<<1] = nod[u<<1|1] = (1<<(add[u]-1));add[u] = 0;} const int maxn = 1e5 + 5;
int add[maxn << 2]; int nod[maxn << 2]; void build(int u,int l,int r) {
nod[u] = 1;
add[u] = 0;
if(l == r) return;
int mid = (l + r) >> 1;
build(ls);
build(rs);
} void update(int u,int l,int r,int x,int y,int ad) {
if(l == x && r == y) {
nod[u] = (1<<(ad-1));add[u] = ad;return;
}
if(add[u]) pushdown(u);
int mid = (l + r) >> 1;
if(y <= mid) update(ls,x,y,ad);
else if(x > mid) update(rs,x,y,ad);
else update(ls,x,mid,ad), update(rs,mid+1,y,ad);
pushup(u);
} int query(int u,int l,int r,int x,int y) {
if(l == x && r == y)return nod[u];
if(add[u])pushdown(u);
int mid = (l + r) >> 1;
if(y <= mid) return query(ls,x,y);
if(x > mid) return query(rs,x,y);
return query(ls,x,mid) | query(rs,mid+1,y);
} int main() {
ios::sync_with_stdio(false);cin.tie(0);
int n,t,o;
char op[2];
int a,b,c;
while(cin >> n >> t >> o) {
build(1,1,n);
while(o--){
cin >> op >> a >> b;
if(a > b) swap(a,b);
if(op[0] == 'C') {
cin >> c;
update(1,1,n,a,b,c);
}
else {
int ans = 0;
int x = query(1,1,n,a,b);
for(int i = 0;i < t;i++)if(x & (1<<i))ans++;
cout << ans << endl;
}
}
}
return 0;
}

[poj2777] Count Color (线段树 + 位运算) (水题)的更多相关文章

  1. Count Color(线段树+位运算 POJ2777)

    Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39917 Accepted: 12037 Descrip ...

  2. poj 2777 Count Color - 线段树 - 位运算优化

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42472   Accepted: 12850 Description Cho ...

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

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

  4. Count Colour_poj2777(线段树+位)

    POJ 2777 Count Color (线段树)   Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...

  5. poj 2777 Count Color(线段树、状态压缩、位运算)

    Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38921   Accepted: 11696 Des ...

  6. POJ 2777 Count Color(线段树+位运算)

    题目链接:http://poj.org/problem?id=2777 Description Chosen Problem Solving and Program design as an opti ...

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

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

  8. POJ 2777 Count Color(线段树之成段更新)

    Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33311 Accepted: 10058 Descrip ...

  9. poj 3225 线段树+位运算

    略复杂的一道题,首先要处理开闭区间问题,扩大两倍即可,注意输入最后要\n,初始化不能随便memset 采用线段树,对线段区间进行0,1标记表示该区间是否包含在s内U T S ← S ∪ T 即将[l, ...

随机推荐

  1. Java XML解析工具 dom4j介绍及使用实例

    Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...

  2. IOS第八天(1:UITableViewController团购,数据转模型,xib显示数据)

    ******HMTg.h 模型数据 #import <Foundation/Foundation.h> @interface HMTg : NSObject @property (nona ...

  3. 投行风云:FO的酸甜苦辣【转】

    全世界收入最高的工作大概就是投行的FO前台部门 (Front Office)部门了.但在拿高薪的同时,也伴随着很多人难以想象的苦逼生活.作为投行最低层的分析师(Analyst),通常需要从早上10点工 ...

  4. java环境搭建系列:JDK从下载安装到简单使用

    最近,问的比较多的问题居然是jdk的问题,对于新手来说这确实有点难度,毕竟一个人经常上网浏览新闻和观看视频的人,一下子开始一门编程语言的环境搭建.这中间需要一个慢慢适应的过程.回想当初我在这个阶段也很 ...

  5. javascript:算法之斐波那契数列

    一 //1,1,2,3,5,8,13,21这个数列 斐波那契 数列(肥波哪弃) //得到第9项是几? /*******************************111111111递归的思想*** ...

  6. 《MongoDB 权威指南》 学习总结

    书目   http://baike.baidu.com/link?url=DVJuvrT4ssbM8V1pKcoRx5H1CwRRCynC6_Ix6YWIrr414opislflpPuY9hRDO4g ...

  7. Swift声明参考

    一条声明可以在你的程序里引入新的名字和构造.举例来说,你可以使用声明来引入函数和方法,变量和常量,或者来定义 新的命名好的枚举,结构,类和协议类型.你也可以使用一条声明来延长一个已经存在的命名好的类型 ...

  8. QMessageBox

    #include "dialog.h" #include "ui_dialog.h" #include<QMessageBox> Dialog::D ...

  9. LightOj 1289 - LCM from 1 to n(LCM + 素数)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1289 题意:求LCM(1, 2, 3, ... , n)%(1<<32), ...

  10. JMeter学习-007-JMeter 断言实例之一 - 响应断言

    之前的文章中已经对如何录制 web 的请求进行了详细的描述,敬请参阅:JMeter学习-004-WEB脚本入门实战 同时,我们的手机应用(例如:京东.天猫.唯品会.携程.易迅 等等 App)所发出的请 ...