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. 创建一个带模版的用户控件 V.2

    前面有做练习<创建一个带模版的用户控件>http://www.cnblogs.com/insus/p/4161544.html .过于简化.通常使用数据控件Repeater会有网页写好He ...

  2. [CLR via C#]25. 线程基础

    一.Windows为什么要支持线程 Microsoft设计OS内核时,他们决定在一个进程(process)中运行应用程序的每个实例.进程不过是应用程序的一个实例要使用的资源的一个集合.每个进程都赋予了 ...

  3. C#的回调方法

    C# 里面回调方法一般指某个委托.也可以说是接口. using System; using System.Collections.Generic; using System.Linq; using S ...

  4. ati显卡驱动后,性能不咋地

    ubuntu装了ati的闭源驱动后,拖动窗口,会有明显的断裂感,不够平滑

  5. [moka收藏]php正则表达式验证

    手机号验证规则[['mobile'], 'match','pattern' =>"/^1[34578]\\d{9}$/"], [['sendmail_limit'],'mat ...

  6. linux线程控制&线程分离

    线程概念 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元. 线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立 ...

  7. Android-将RGB彩色图转换为灰度图

    package com.example.yanlei.wifi; import android.graphics.Bitmap; import android.graphics.BitmapFacto ...

  8. SharePoint 服务器端对象模型操作文档库(上传/授权/查看权限)

    简介:上传文档到文档库,并对项目级授权,查看项目级权限方法         //在列表根目录下创建文件夹 public static string CreatFolderToSPDocLib(stri ...

  9. Android按钮的四种点击事件

    本文记录一下按钮的四种点击事件 第一种 public class MainActivity extends Activity { @Override protected void onCreate(B ...

  10. Cocos2d入门--3--小球运动

    本章直接上源代码.内容不难,主要就是 HelloWorldScene.h文件: #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H_ ...