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(线段树之成段更新)的更多相关文章

  1. POJ 2777 Count Color (线段树成段更新+二进制思维)

    题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...

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

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

  3. poj 2777 Count Color(线段树)

    题目地址:http://poj.org/problem?id=2777 Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

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

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

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

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

  6. Codeforces295A - Greg and Array(线段树的成段更新)

    题目大意 给定一个序列a[1],a[2]--a[n] 接下来给出m种操作,每种操作是以下形式的: l r d 表示把区间[l,r]内的每一个数都加上一个值d 之后有k个操作,每个操作是以下形式的: x ...

  7. hdu 1698 Just a Hook(线段树之 成段更新)

    Just a Hook                                                                             Time Limit: ...

  8. POJ P2777 Count Color——线段树状态压缩

    Description Chosen Problem Solving and Program design as an optional course, you are required to sol ...

  9. POJ 3468 A Simple Problem with Integers //线段树的成段更新

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 59046   ...

随机推荐

  1. html图片上下翻滚展示代码

    <marquee behavior="alternate" scrolldelay="1" direction="up" width= ...

  2. ajax请求跨域问题

    ajax跨域,这个是面试的时候常被问到,也是在做项目的时候会遇到的问题,在之前的项目中就有遇到过,这里根据经验写了三种分享下 1.使用中间层过渡的方式 简单来说就是"后台代理",把 ...

  3. 【循序渐进学Python】7.面向对象的核心——类型(上)

    我们知道Python是一门面向对象的脚本语言.从C#的角度来看:首先Python支持多继承.Python 类型成员通常都是public的,并且所有成员函数都是virtual的(可以直接重写). 1. ...

  4. JS实现注销功能

    JS实现注销功能,代码如下: <script> window.history.forward(1); </script> 这个代码的用法就是: 比如,我们此时有两个页面:Log ...

  5. csharp: Export DataSet into Excel and import all the Excel sheets to DataSet

    /// <summary> /// Export DataSet into Excel /// </summary> /// <param name="send ...

  6. 行转列一定要sum

    --SELECT 姓名 ,-- 课程 ,-- 分数--FROM tb UNPIVOT ( 分数 FOR 课程 IN ( [语文], [数学], [物理] ) ) t --)

  7. SharpGL学习笔记(十四) 材质:十二个材质球

    材质颜色 OpenGL用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...

  8. 实验12:Problem E: 还会用继承吗?

    Home Web Board ProblemSet Standing Status Statistics   Problem E: 还会用继承吗? Problem E: 还会用继承吗? Time Li ...

  9. 解决Sharepoint每天第一次打开速度慢的问题

    每天第一次打开Sharepoint的网站会非常慢,下面是解决这个问题的几个方法. 添加crl.microsoft.com到Hosts文件,IP地址指向服务器本机. 允许服务器直接连接到crl.micr ...

  10. NLog 自定义字段 写入 oracle

    1.通过Nuget安装NLog 下载,简单入门 请参照 我刚才转的几篇文章,下面我直接贴代码 2.建表语句 create table TBL_LOG ( id ) not null, appname ...