解题报告

题意:

对线段染色。询问线段区间的颜色种数。

思路:

本来直接在线段树上染色,lz标记颜色。每次查询的话訪问线段树,求出颜色种数。结果超时了,最坏的情况下,染色能够染到叶子节点。

换成存下区间的颜色种数,这样每次查询就不用找到叶子节点了。用按位或来处理颜色种数。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int sum[500000],lz[500000],ans;
void push_down(int rt,int l,int r)
{
if(lz[rt])
{
lz[rt<<1]=lz[rt<<1|1]=lz[rt];
sum[rt<<1]=lz[rt];
sum[rt<<1|1]=lz[rt];
lz[rt]=0;
}
}
void push_up(int rt,int l,int r)
{
sum[rt]=sum[rt<<1]|sum[rt<<1|1];
}
void cbtree(int rt,int l,int r)
{
if(l==r)
{
sum[rt]=1;
return ;
}
int mid=(l+r)>>1;
cbtree(rt<<1,l,mid);
cbtree(rt<<1|1,mid+1,r);
push_up(rt,l,r);
}
void update(int rt,int l,int r,int ql,int qr,int v)
{
if(ql>r||qr<l)return ;
if(ql<=l&&r<=qr)
{
lz[rt]=v;
sum[rt]=v;
return ;
}
int mid=(l+r)>>1;
push_down(rt,l,r);
update(rt<<1,l,mid,ql,qr,v);
update(rt<<1|1,mid+1,r,ql,qr,v);
push_up(rt,l,r);
}
int _q(int rt,int l,int r,int ql,int qr)
{
if(ql>r||qr<l)return 0;
if(ql<=l&&r<=qr)
{
return sum[rt];
}
push_down(rt,l,r);
int mid=(l+r)>>1;
return _q(rt<<1,l,mid,ql,qr) | _q(rt<<1|1,mid+1,r,ql,qr); }
int main()
{
int n,t,q,ql,qr,i,j,a,k;
char str[10];
scanf("%d%d%d",&n,&t,&q);
cbtree(1,1,n);
while(q--)
{
scanf("%s",str);
if(str[0]=='C')
{
scanf("%d%d%d",&ql,&qr,&a);
if(ql>qr)swap(ql,qr);
update(1,1,n,ql,qr,1<<(a-1));
}
else
{
scanf("%d%d",&ql,&qr);
if(ql>qr)swap(ql,qr);
ans=_q(1,1,n,ql,qr);
int cnt=0;
while(ans)
{
if(ans%2)
cnt++;
ans/=2;
}
printf("%d\n",cnt);
}
}
return 0;
}
Count Color
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 35143   Accepted: 10591

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

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. HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )

    线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...

  3. poj 3669 线段树成段更新+区间合并

    添加 lsum[ ] , rsum[ ] , msum[ ] 来记录从左到右的区间,从右到左的区间和最大的区间: #include<stdio.h> #define lson l,m,rt ...

  4. poj 3468 A Simple Problem with Integers 【线段树-成段更新】

    题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...

  5. 线段树(成段更新) POJ 3468 A Simple Problem with Integers

    题目传送门 /* 线段树-成段更新:裸题,成段增减,区间求和 注意:开long long:) */ #include <cstdio> #include <iostream> ...

  6. POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)

    A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...

  7. poj 3648 线段树成段更新

    线段树成段更新需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候.延迟标记的意思是:这个区间的左右儿子都需要被更新,但是当 ...

  8. ZOJ 1610 Count the Colors (线段树成段更新)

    题意 : 给出 n 个染色操作,问你到最后区间上能看见的各个颜色所拥有的区间块有多少个 分析 : 使用线段树成段更新然后再暴力查询总区间的颜色信息即可,这里需要注意的是给区间染色,而不是给点染色,所以 ...

  9. ACM: Copying Data 线段树-成段更新-解题报告

    Copying Data Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description W ...

随机推荐

  1. [RxJS] Starting a Stream with SwitchMap & switchMapTo

    From an event map to another event we can use switchMap(), switchMap() accept an function which retu ...

  2. javasscript学习笔记 之 数组学习二 数组的所有方法

    1.push() 和 pop()  栈的方法 后进先出 push() 该方法是向数组末尾添加一个或者多个元素,并返回新的长度. push()方法可以接收任意数量的参数,把它们逐个添加到数组的末尾,并返 ...

  3. work staff

    培训一周,很抓狂.不是抓狂培训本身,是自己听不懂,培训还是有用的. 上周四接到一个task,关于checklist.因为组里没有人用过,所以遇到一些问题,本来不应该是一个复杂的工作,但是我需要一个一个 ...

  4. winscp连接vmware ubuntu

    winscp连接vmware ubuntu,因为第一次安装在虚拟机上的ubuntu是没有ssh服务的,不能在windows上通过工具进行连接,所以需要以下步骤进行ssh配置     1:检查ssh状态 ...

  5. redis基础操作

    /** * redis的Java客户端Jedis测试验证 * * @author */ public class Test { /** * 非切片客户端链接 */ private Jedis jedi ...

  6. [Mac] 使用Mac时的一些技巧

    这篇博客就用来记录自己在使用Mac时学来的一些技巧吧! 1. 如何开启 Sticky key (在屏幕上显示输入的控制键)   就是这个东西啦,就是在视频演示的时候让别人看到自己按了什么控制键. 在s ...

  7. EL表达式取整

    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 1. <fm ...

  8. CSS Reset方法

    CSS Reset 即重设浏览器的样式.在各种浏览器中,都会对CSS的选择器默认一些数值,譬如当h1没有被设置数值时,显示一定大小. 但并不是所有的浏览器都使用一样的数值,所以,有了CSS Reset ...

  9. 16-js-缓冲运动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. js中几个容易混淆的概念

    1. var name = "The Window";var object = {name : "My Object",getName: function(){ ...