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 ...
随机推荐
- Unity Shader入门基础(一)
渲染流水线 一.渲染流水线 渲染流水线的工作任务在于由一个三维场景出发.生存(或者说渲染)一张二维图像.换句话说,计算机需要从一系列的顶点数据.纹理等信息出发,把这些信息最终转换成一张人眼可以看到 ...
- 用stimulsoft Reports报表工具制作简单报表的过程
这是在数据库sql server中People表的数据
- 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务
[源码下载] 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后 ...
- mysql学习笔记 第七天
数据库的备份与还原 数据库的备份与还原是后面章节的内容,但是在学习的时候已经需要数据的备份与还原了,所以就了解了一下.数据库有很多种备份方法,我学习的是其中的一种 备份: 对于数据库的备份: C:&g ...
- ReactNative——生命周期
1.创建阶段 getDefaultProps:处理props的默认值 在react.createClass调用 //在创建类的时候被调用 this.props该组件的默认属性 2.实例化阶段 Reac ...
- [mysql] 一次sql耗时高引发报警的分析和处理
1.现象: 最近两天在每天的凌晨0:15-20分左右收到报警短息,报警内容: JDBC-SQL请求最近三分钟内平均耗时时间过高的报警,监控类型:SQL... 2.分析: 从现象来看 每天凌晨15分,可 ...
- android onNewIntent
在Android应用程序开发的时候,从一个Activity启动另一个Activity并传递一些数据到新的Activity上非常简单,但是当您需要让后台运行的Activity回到前台并传递一些数据可能就 ...
- css3实现动态圆形导航栏
核心问题: 1.圆形怎样实现? css3的圆角属性:border-radius:__ px; 把值设大点就圆啦. 2.怎样实现动画效果? css3的transition属性:transition:__ ...
- iscroll性能
iscroll是比较耗性能的,在iPhone和性能比较好的机是比较流畅的,在性能低的手机就会出现卡的情况.所以如果不想出现这种情况,只有不使用iscroll,囧.
- AJAX请求中含有数组解决办法
当我们发送AJAX请求的数据中带有数组时,是不能像普通JSON数据一样,直接放在data里发送给后台,比如有这样一个数据需要发送给后台: { "orderId": 22, &quo ...