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 ...
随机推荐
- DataTable 获取列名 DataTable批量更新至数据库
好久没写东西了,这几个月也没下功夫钻研技术,愧疚啊.说下最近刚学会的DataTable 的用法吧,新手适合看下. 1 DataTable 获取列名 在处理数据的时候大家都会用到模型,从datatabl ...
- C#十五子游戏
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 重新想象 Windows 8.1 Store Apps (72) - 新增控件: AppBar, CommandBar
[源码下载] 重新想象 Windows 8.1 Store Apps (72) - 新增控件: AppBar, CommandBar 作者:webabcd 介绍重新想象 Windows 8.1 Sto ...
- PHP 操作mongodb api大部分方法
<?php /* PHP mongodb * 全部curd操作 * @author:xiaojiang * @date: 2014-10-27 */ //查看 mongo类版本 1.30 以后版 ...
- 使django与数据库保持长连接
最近遇到一个很蛋疼的问题,写了一个后台管理系统, 由于是后台管理系统,所以使用频率不是很高,当django程序在闲置一段时间后,再次打开后台系统,就变得很慢,然后又好了.查了很多方面,从模板引擎到请求 ...
- 【翻译】配置RSVP-signaled LSP
源地址: https://www.juniper.net/techpubs/software/junos-security/junos-security10.2/junos-security-swco ...
- React对话框组件实现
当下前端届最火的技术之一莫过于React + Redux + webpack的技术结合.最近公司内部也正在转react,这周主要做了个React的modal组件,接下来谈下具体实现过程. 基本的HTM ...
- ArcGIS的许可文件问题
ArcGIS我是从9.3版本开始使用的,当时破解非常麻烦,容易出现各种问题,当时生成的许可文件是一个单独的exe:后来10版本甚至10.1都出来,我还是使用的那个exe来生成许可文件,正常使用没有问题 ...
- Sharepoint 2013 列表使用JS Link
使用JS Link可以向Sharepoint List注册脚本,重写Field模板,使得对于符合条件的字段改变格式和样式.但是有一个问题是,页面postback的话,JS不会被触发,不知道怎么解,有知 ...
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q28-Q31)
Question28You have a Microsoft Office SharePoint Server 2007 site.You upgrade the site to SharePoint ...