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

然后发现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. cpu为什么使用虚拟地址到物理地址的空间映射,解决了什么样的问题?

    当处理器读或写入内存位置时,它会使用虚拟地址.作为读或写操作的一部分,处理器将虚拟地址转换为物理地址.通过虚拟地址访问内存有以下优势: 程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓 ...

  2. php课程---Windows.open()方法参数详解

    Window.open()方法参数详解 1, 最基本的弹出窗口代码   window.open('page.html'); 2, 经过设置后的弹出窗口   window.open('page.html ...

  3. IOS第14天(2, Modal控制)

    ******控制器modal - (void)btnClick { // 创建控制器对象 HMJumpViewController *jump = [[HMJumpViewController all ...

  4. swift 2.x学习笔记(一)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #008400 } p.p2 { margin: 0.0px 0. ...

  5. 用GSON解析Json格式数据

    GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...

  6. Where is the Global.asax.cs file

    I am using VS 2008. I have created a new Asp.net web site project from File->New->Website-> ...

  7. UIBarButtonItem的创建

    1. rightBarButtonItem的创建 -(void)initRightBar{ UIBarButtonItem *done =[UIBarButtonItem rightItemWithT ...

  8. NET 框架基本原理透析⑵

    生成.打包.部署及管理应用程序与类型 要生成就离不开程,序集,程序集是包含一个或多个类型定义文件和资源文件的集合.在程序集包含的所有文件中,有一个文件用于保存清单.清单是另外一组元数据表的集合,其中主 ...

  9. JS之访问器

    1.在对象中定义get,set访问器属性 <script> var test = { _name:"pmx", _age:18, _born:1990, get nam ...

  10. linux pptpd账号同时登录的问题

    最近搞了个云主机搭建个VPN服务器给自己用, 特别是在公共场所的wifi上网时, 很多APP, 或者网站是没有https的, 所以为了保证信息(主要是账号密码)的安全, 搭个私有vpn还是很有必要的. ...