POJ 2777 Count Color(线段树之成段更新)
Count Color
Time Limit: 1000MS
Memory Limit: 65536K
Total Submissions: 33311
Accepted: 10058
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
[Submit] [Go Back] [Status] [Discuss]
::会线段树的很容易知道怎么做这道题,这道题关键要解决重复计算的颜色,我用have[]来表示该颜色是否已经计算过
1: #include <iostream>
2: #include <cstdio>
3: #include <cstring>
4: #include <cmath>
5: #include <algorithm>
6: using namespace std;
7: typedef long long ll;
8: #define lson l,m,rt<<1
9: #define rson m+1,r,rt<<1|1
10: const int N=100000;
11: int col[N<<2],t,sum;
12: bool have[50];
13:
14: void Down(int rt)
15: {
16: if(col[rt]){
17: col[rt<<1]=col[rt<<1|1]=col[rt];
18: col[rt]=0;
19: }
20: }
21:
22: void build(int l,int r,int rt)
23: {
24: col[rt]=1;
25: if(l==r) return;
26: int m=(l+r)>>1;
27: build(lson);
28: build(rson);
29: }
30:
31: void update(int L,int R,int c,int l,int r,int rt)
32: {
33: if(L<=l&&R>=r){
34: col[rt]=c;
35: return;
36: }
37: Down(rt);
38: int m=(l+r)>>1;
39: if(L<=m) update(L,R,c,lson);
40: if(R>m) update(L,R,c,rson);
41: }
42:
43: void query(int L,int R,int l,int r,int rt)
44: {
45: if(sum==t) return;
46: if(col[rt]) {
47: if(!have[col[rt]]){
48: have[col[rt]]=true;
49: sum++;
50: }
51: return;
52: }
53: Down(rt);
54: int m=(l+r)>>1;
55: if(L<=m) query(L,R,lson);
56: if(R>m) query(L,R,rson);
57: }
58:
59:
60: int main()
61: {
62: int len,n;
63: while(scanf("%d%d%d",&len,&t,&n)>0)
64: {
65: build(1,len,1);
66: for(int i=0; i<n; i++)
67: {
68: char s[2];
69: int L,R;
70: scanf("%s%d%d",s,&L,&R);
71: if(L>R) swap(L,R);//个人觉得如果题目没有说明L<=R,那么一定要加这一句,以免出错
72: if(s[0]=='C'){
73: int c;
74: scanf("%d",&c);
75: update(L,R,c,1,len,1);
76: }
77: else{
78: memset(have,false,sizeof(have));
79: sum=0;
80: query(L,R,1,len,1);
81: printf("%d\n",sum);
82: }
83: }
84: }
85: return 0;
86: }
POJ 2777 Count Color(线段树之成段更新)的更多相关文章
- POJ 2777 Count Color (线段树成段更新+二进制思维)
题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...
- poj 2777 Count Color(线段树区区+染色问题)
题目链接: poj 2777 Count Color 题目大意: 给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C a b c 把区间[a,b]涂为c色,P a b 查 ...
- poj 2777 Count Color(线段树)
题目地址:http://poj.org/problem?id=2777 Count Color Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- poj 2777 Count Color - 线段树 - 位运算优化
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42472 Accepted: 12850 Description Cho ...
- poj 2777 Count Color(线段树、状态压缩、位运算)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 38921 Accepted: 11696 Des ...
- Codeforces295A - Greg and Array(线段树的成段更新)
题目大意 给定一个序列a[1],a[2]--a[n] 接下来给出m种操作,每种操作是以下形式的: l r d 表示把区间[l,r]内的每一个数都加上一个值d 之后有k个操作,每个操作是以下形式的: x ...
- hdu 1698 Just a Hook(线段树之 成段更新)
Just a Hook Time Limit: ...
- POJ P2777 Count Color——线段树状态压缩
Description Chosen Problem Solving and Program design as an optional course, you are required to sol ...
- POJ 3468 A Simple Problem with Integers //线段树的成段更新
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 59046 ...
随机推荐
- C#如何获取CPU处理器核心数量
有几条不同的处理器信息,您可以获得有关的信息:物理处理器数量.核心数量和逻辑处理器数量,这些可以不同.两颗双核超线程(启用)处理器的机器情况下有:2个物理处理器.4个核心和8个逻辑处理器. 逻辑处理器 ...
- Python入门笔记(15):对文件的操作(1)
一.文件对象 我理解的文件对象就是一个接口,通过这个接口对文件进行相关操作. <Python 核心编程>上说的很晦涩,这里没有深刻理解到,希望有人能解释给我听. >>> ...
- 内核移植和文件系统制作(4):UBIFS根文件系统制作总结
UBIFS文件系统简介: 无排序区块图像文件系统(UnsortedBlock Image File System, UBIFS)是用于固态硬盘存储设备上,并与LogFS相互竞争,作为JFFS2的后继文 ...
- yii2时间日期控件的使用[转]
注:原文http://www.manks.top/yii2-datetimepicker.html 有更改 1.安装 进入到项目文件中D:\phpStudy\WWW\yii2blog 使用cmd ...
- java多线程(三)——锁机制synchronized(同步语句块)
用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法之行一个长时间的任务,那么B线程必须等待比较长的时间,在这样的情况下可以使用synchronized同步语句快来解 ...
- javascript 之注意url特殊字符限制
引子 浏览器URl地址,上网一定会用到,但是浏览器地址有中文或者浏览器url参数操作的时候,经常会用到encodeURIComponent()和decodeURIComponent()以及encode ...
- LCA算法倍增算法(洛谷3379模板题)
倍增(爬树)算法,刚刚学习的算法.对每一个点的父节点,就记录他的2k的父亲. 题目为http://www.luogu.org/problem/show?pid=3379 第一步先记录每一个节点的深度用 ...
- 【OpenCV】OpenCV中GPU模块使用
CUDA基本使用方法 在介绍OpenCV中GPU模块使用之前,先回顾下CUDA的一般使用方法,其基本步骤如下: 1.主机代码执行:2.传输数据到GPU:3.确定grid,block大小: 4.调用内核 ...
- 如何rename sqlserver database
Problem Sometimes there is a need to change the name of your database whether this is because the or ...
- ABAP中Conversion Routine示例
在SAP的Domain定义中,Output Length下面有个Convers. routine的标识,这是SAP用来进行输入输出转换的.我们知道,屏幕上的I/O字段都是字符串形式的,而数 ...