poj2777 Count Color

原创 2016年05月30日 20:37:23

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.

题解:

令线段树节点定义为: l,r,value,flag分被表示区间左右端点,该区间的涂色为value,flag为标记量,true表示该区间涂色为最新的涂色,否则表示该区间的子区间有更新的涂色。由于初始时均涂色为1,故value的值均为1,flag均为true(即都是最新的涂色)。本题的难点在于更新和查找。

代码:

with tree[p] do  
    begin  
      if (l=b) and (r=e) then  
        begin  
          color:=1 shl (c-1);  
          cover:=true;  
          exit;  
        end;  
      if cover then  
        begin  
          cover:=false;  
          tree[p*2].cover:=true;  
          tree[p*2].color:=color;  
          tree[p*2+1].cover:=true;  
          tree[p*2+1].color:=color;  
        end;  
      m:=(l+r) div 2;  
      if e<=m then ins(p*2,b,e,c) else  
        if b>m then ins(p*2+1,b,e,c) else  
          begin  
            ins(p*2,b,m,c);  
            ins(p*2+1,m+1,e,c);  
          end;  
      color:=tree[p*2].color or tree[p*2+1].color;  
    end;  

版权声明:要转载的“汪”一声,价钱面谈。

poj2777--Count Color(线段树,二进制转化)

Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34950   A...
  • u013015642
  • u013015642
  • 2014年08月04日 21:48
  • 947

poj2777Count Color(线段树)

Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 40404   A...
  • d_x_d
  • d_x_d
  • 2015年12月20日 17:52
  • 2079

【poj2777】Count Color

被小伙伴拉着做的题,线段树的裸题
  • zhaoyh2000
  • zhaoyh2000
  • 2017年02月27日 21:45
  • 98

POJ2777 Count Color

Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34022   ...
  • eeeaaaaa
  • eeeaaaaa
  • 2014年06月22日 09:35
  • 273

poj2777:Count Color

就是给你一个1..L的线段,不停地染色,并询问区间上由多少种颜色组成。 由于颜色数很小(不大于30),便可以用一个32位整数来表示颜色的集合。 自底向上更新是做集合的并(就是按位或)。 同样只有在纯色...
  • ZMOIYNLP
  • ZMOIYNLP
  • 2015年02月15日 21:15
  • 339

poj2777 Count Color(成段更新)

http://poj.org/problem?id=2777 题意:给你一个长板,宽度为l,t种颜色,o项操作。操作共两种,更新一个区间内的颜色,求一个区间内的颜色数量,输出。 思路:...
  • Flynn_curry
  • Flynn_curry
  • 2016年05月09日 21:18
  • 122

poj2777——Count Color

搞得好囧,像自己A,结果还是盗版货,而且郁闷了好久才见ac的,擦擦。。。ps:本来也想这么做的:每次染色的时候,并不更新到子节点,而是把信息上次的和目前的信息综合之后,再判断是否向下更新的,结果,采用...
  • k1246195917
  • k1246195917
  • 2010年10月27日 22:17
  • 380

Count Color[poj2777]

线段树 标记下传
  • hccz95
  • hccz95
  • 2011年03月26日 08:35
  • 597

POJ2777 Count Color(线段树)

题意:有一个长版,有两种操作,一种是在区间[a,b]上颜色,另外一种是询问区间有多少种颜色思路:线段树维护一个color信息,其中color>0表示节点所指的区间都有某种颜色color, color=...
  • qq_21057881
  • qq_21057881
  • 2016年04月13日 21:55
  • 142

POJ2777 Count Color 线段树

题意: 给一个固定长度为L的画板 有两个操作: C A B C:区间AB内涂上颜色C。 P A B:查询区间AB内颜色种类数。 思路: 首先显然是要线段树。 每个节点有如下参数:...
  • wuyanyi
  • wuyanyi
  • 2011年12月01日 23:17
  • 2629
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj2777 Count Color
举报原因:
原因补充:

(最多只允许输入30个字)