A Corrupt Mayor's Performance Art

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others)
Total Submission(s): 33    Accepted Submission(s): 11

Problem Description
Corrupt governors always find ways to get dirty money. Paint
something, then sell the worthless painting at a high price to someone
who wants to bribe him/her on an auction, this seemed a safe way for
mayor X to make money.

Because a lot of people praised mayor
X's painting(of course, X was a mayor), mayor X believed more and more
that he was a very talented painter. Soon mayor X was not satisfied with
only making money. He wanted to be a famous painter. So he joined the
local painting associates. Other painters had to elect him as the
chairman of the associates. Then his painting sold at better price.

The local middle school from which mayor X graduated, wanted to beat
mayor X's horse fart(In Chinese English, beating one's horse fart means
flattering one hard). They built a wall, and invited mayor X to paint on
it. Mayor X was very happy. But he really had no idea about what to
paint because he could only paint very abstract paintings which nobody
really understand. Mayor X's secretary suggested that he could make this
thing not only a painting, but also a performance art work.

This was the secretary's idea:

The wall was divided into N segments and the width of each segment
was one cun(cun is a Chinese length unit). All segments were numbered
from 1 to N, from left to right. There were 30 kinds of colors mayor X
could use to paint the wall. They named those colors as color 1, color 2
.... color 30. The wall's original color was color 2. Every time mayor X
would paint some consecutive segments with a certain kind of color, and
he did this for many times. Trying to make his performance art fancy,
mayor X declared that at any moment, if someone asked how many kind of
colors were there on any consecutive segments, he could give the number
immediately without counting.

But mayor X didn't know how to
give the right answer. Your friend, Mr. W was an secret officer of
anti-corruption bureau, he helped mayor X on this problem and gained his
trust. Do you know how Mr. Q did this?

 
Input
There are several test cases.

For each test case:

The first line contains two integers, N and M ,meaning that the wall
is divided into N segments and there are M operations(0 < N <=
1,000,000; 0<M<=100,000)

Then M lines follow, each representing an operation. There are two kinds of operations, as described below:

1) P a b c
a, b and c are integers. This operation means that mayor X painted
all segments from segment a to segment b with color c ( 0 < a<=b
<= N, 0 < c <= 30).

2) Q a b
a and b are
integers. This is a query operation. It means that someone asked that
how many kinds of colors were there from segment a to segment b ( 0 <
a<=b <= N).

Please note that the operations are given in time sequence.

The input ends with M = 0 and N = 0.

 
Output
For each query operation, print all kinds of color on the queried
segments. For color 1, print 1, for color 2, print 2 ... etc. And this
color sequence must be in ascending order.
 
Sample Input
5 10
P 1 2 3
P 2 3 4
Q 2 3
Q 1 3
P 3 5 4
P 1 2 7
Q 1 3
Q 3 4
P 5 5 8
Q 1 5
0 0
 
Sample Output
4
3 4
4 7
4
4 7 8
 
Source
 
代码:G++ 281ms
 #define LOCAL
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=; struct node
{
int lef,rig; //通过和的大小来比较种类是否一样
int cnt; //跟新的种类
int type; //保存的种类
int mid(){
return lef+(rig-lef>>);
}
}; node sac[maxn<<];
int ans[maxn*],ct; void Build(int left,int right,int pos)
{
sac[pos]=(node){left,right,,}; //单一
if(left==right) return ;
int mid=sac[pos].mid();
Build(left,mid,pos<<);
Build(mid+,right,pos<<|);
} void Update(int left,int right,int pos,int val)
{
if(left<=sac[pos].lef&&sac[pos].rig<=right)
{
sac[pos].cnt=val;
sac[pos].type=val;
return ;
} if(sac[pos].cnt!=)
{ //向下更新一次
sac[pos<<|].cnt=sac[pos<<].cnt=sac[pos].cnt;
sac[pos<<|].type=sac[pos<<].type=sac[pos].type;
sac[pos].cnt=;
}
int mid=sac[pos].mid();
if(mid>=left)
Update(left,right,pos<<,val);
if(mid<right)
Update(left,right,pos<<|,val);
if(sac[pos<<].type==sac[pos<<|].type)
sac[pos].type=sac[pos<<].type;
else sac[pos].type=;
} void Query(int pos,int left,int right) {//查找操作 if(sac[pos].lef>right||sac[pos].rig<left)
return ; if(sac[pos].type)
{
ans[ct++]=sac[pos].type;
return ;
}
Query(pos<<,left,right);
Query(pos<<|,left,right); } int main()
{
int n,m,a,b,c;
char s[];
#ifdef LOCAL
freopen("test.in","r",stdin);
#endif
while(scanf("%d%d",&n,&m),n+m!=){
Build(,n,);
ct=;
while(m--)
{
scanf("%s",s);
if(s[]=='P'){
scanf("%d%d%d",&a,&b,&c);
Update(a,b,,c);
}
else
{
scanf("%d%d",&a,&b);
Query(,a,b);
sort(ans,ans+ct);
printf("%d",ans[]);
for(int i=;i<ct;i++){
if(ans[i]!=ans[i-])
printf(" %d",ans[i]);
}
printf("\n");
ct=;
}
}
}
return ;
}

hdu----(5023)A Corrupt Mayor's Performance Art(线段树区间更新以及区间查询)的更多相关文章

  1. HDU 5023 A Corrupt Mayor's Performance Art 线段树区间更新+状态压缩

    Link:  http://acm.hdu.edu.cn/showproblem.php?pid=5023 #include <cstdio> #include <cstring&g ...

  2. hdu 5023 A Corrupt Mayor's Performance Art 线段树

    A Corrupt Mayor's Performance Art Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 100000/100 ...

  3. HDU5023:A Corrupt Mayor's Performance Art(线段树区域更新+二进制)

    http://acm.hdu.edu.cn/showproblem.php?pid=5023 Problem Description Corrupt governors always find way ...

  4. HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...

  5. ACM学习历程—HDU 5023 A Corrupt Mayor's Performance Art(广州赛区网赛)(线段树)

    Problem Description Corrupt governors always find ways to get dirty money. Paint something, then sel ...

  6. HDU 5023 A Corrupt Mayor's Performance Art (据说是线段树)

    题意:给定一个1-n的墙,然后有两种操作,一种是P l ,r, a 把l-r的墙都染成a这种颜色,另一种是 Q l, r 表示,输出 l-r 区间内的颜色. 析:应该是一个线段树+状态压缩,但是我用s ...

  7. 2014 网选 广州赛区 hdu 5023 A Corrupt Mayor's Performance Art

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #d ...

  8. hdu - 5023 - A Corrupt Mayor's Performance Art(线段树)

    题目原文废话太多太多太多,我就不copyandpaste到这里啦..发个链接吧题目 题目意思就是:P  l  r  c  将区间 [l ,r]上的颜色变成c    Q  l r 就是打印出区间[l,r ...

  9. POJ 2528 Mayor's posters(线段树/区间更新 离散化)

    题目链接: 传送门 Mayor's posters Time Limit: 1000MS     Memory Limit: 65536K Description The citizens of By ...

随机推荐

  1. oracle 触发器实现主键自增

    drop table book; --创建表 create table book( bookId varchar2() primary key, name varchar2() ); --创建序列 c ...

  2. c++ float 带 e 的指数

    带e是指10的 e后面次方 #include <iostream> int main() { float f; f = 9.87654321f; std::cout << f ...

  3. 【转载】跟着9张思维导图学习JavaScript

    原文:跟着9张思维导图学习JavaScript 学习的道路就是要不断的总结归纳,好记性不如烂笔头,so,下面将 po 出我收集的 9 张 JavaScript相关的思维导图(非原创). 思维导图小ti ...

  4. Java_你应该知道的26种设计模式

    四. 模板方法模式 Definition: Define the skeleton of an algorithm in an operation, deferring some steps to s ...

  5. 关于STM32库中 __IO 修饰符(volatile修饰符,反复无常的意思)

    STM32例子代码中会有像这样的代码 static __IO uint32_t TimingDelay;  这里边的__IO修饰符不好理解,单从字面可以看出是为IO相关,查其标准库可以得知这个__IO ...

  6. wince下的CPU和内存占用率计算

    #include <Windows.h> DWORD Caculation_CPU(LPVOID lpVoid) { MEMORYSTATUS MemoryInfo; DWORD Perc ...

  7. UML分析与设计

    考点: 掌握面向对象的分析与设计 掌握UML描述方法 用例图.类图.序列图.状态转换图 类图:类的属性.方法的识别:类间的各种关系 类图:实体.联系 各种关系图例: 泛化:取公共属性 关联分为聚合.组 ...

  8. js 小数相加异常

    var a = 0.1; var b = 0.2; a + b//0.30000000000000004 这个bug可能是因为二进制计算溢出导致的. 解决办法:将小数转换为整数进行计算 计算后结果除以 ...

  9. Quartz.Net 调度框架配置介绍

    在平时的工作中,估计大多数都做过轮询调度的任务,比如定时轮询数据库同步,定时邮件通知等等.大家通过windows计划任务,windows服务等都实现过此类任务,甚至实现过自己的配置定制化的框架.那今天 ...

  10. javascript学习-原生javascript的小特效(原生javascript实现链式运动)

    以下代码就不详细解析了,在我之前的多个运动效果中已经解析好多次了,重复的地方这里就不说明了,有兴趣的童鞋可以去看看之前的文章<原生javascript的小特效> <!DOCTYPE ...