题目原文废话太多太多太多,我就不copyandpaste到这里啦。。发个链接吧题目

题目意思就是:P  l  r  c  将区间 [l ,r]上的颜色变成c    Q  l r 就是打印出区间[l,r]中所有的颜色,并且要升序排列出来,注意最坑的就是各个区间的颜色初始化为2,这个条件竟然夹杂在那又长又臭的题目的某个角落里面!!

比赛的时候思路是有的,并且也能想到用set来撸,哎,对set的用法太挫逼了,写线段树又写得太挫逼了,后来补回这道题的时候,才发现其实是一道非常常规的线段树,所以最近给自己留了20道线段树慢慢刷,主要是能够更加熟练地写出线段树的模板,因为我发觉之前只是看得懂别人写的线段树的代码,却很少完全靠自己去敲出来,今天在补这道题的时候依然wa了很多次,最终才发现在query的那里忘记PushDown了  QAQ,废话少说 直接贴代码:

 #include <cstdio>
#include <iostream>
#include <queue>
#include <set>
#include <cstring>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn = ;
set<int> ans;
int SIZE;
int sum[maxn<<];
void PushDown(int rt){
if(sum[rt]){
sum[rt<<] = sum[rt];
sum[rt<<|] = sum[rt];
sum[rt] = ;
}
}
void build(int l,int r,int rt){
if(l == r){
sum[rt] = ;return;
}
int m = (l + r) >>;
build(lson);
build(rson);
return ;
}
void update(int L,int R,int c,int l,int r,int rt){
if(L <= l&&r <= R){
sum[rt] = c;
return ;
}
int m = (l + r)>>;
PushDown(rt);
if(L <= m) update(L,R,c,lson); if(m < R) update(L,R,c,rson);
return ;
}
void query(int L,int R,int l,int r,int rt){
//if(rt > SIZE) return;
if(L <= l&&r <= R&&sum[rt]){
ans.insert(sum[rt]);
return ;
}
PushDown(rt);
int m = (l + r)>>;
if(L <= m) query( L, R,lson);
if(m < R) query( L, R,rson);
return;
}
void print(){
set<int>::iterator it;
it = ans.begin();
cout<<*it;
ans.erase(it);
for(it = ans.begin();it != ans.end();++it)
printf(" %d",*it);
puts("");
}
void print_debug(){
cout<<"sum: "<<endl;
for(int i = ;i <= ;i++)
cout<<sum[i]<<" ";
puts("");
}
int main(){
int N,Q,a,b,c;
char ope[];
while(~scanf("%d%d",&N,&Q)&&(N+Q)){
SIZE = (N+)*N/;
memset(sum,,sizeof(sum));
build(,N,);
while(Q--){
scanf("%s",ope);
if(ope[] == 'Q'){
scanf("%d%d",&a,&b);
ans.clear();
query(a,b,,N,);
print();
}else{
scanf("%d%d%d",&a,&b,&c);
update(a,b,c,,N,);
//print_debug();
}
}
}
return ;
}

然后我又看到了另一份比较好玩的代码,是通过巧妙的位移运算来表示的,恩 感觉挺好的  链接请点击~

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define lson l , mid , rt << 1
#define rson mid + 1 , r , rt << 1 | 1
#define LL int const int maxn = ;
LL add[maxn<<];
LL sum[maxn<<];
void PushUp(int rt)
{
//把当前结点的信息更新到父结点
sum[rt] = sum[rt<<] | sum[rt<<|];//总共的颜色
}
void PushDown(int rt,int m)
{
if(add[rt])
{
add[rt<<] = add[rt];
add[rt<<|] = add[rt];
sum[rt<<] = add[rt] ;
sum[rt<<|] = add[rt] ;
add[rt] = ;//将标记向儿子节点移动后,父节点的延迟标记去掉
//传递后,当前节点标记域清空
}
}
void build(int l,int r,int rt)
{
add[rt] = ;//初始化为所有结点未被标记
if (l == r)
{
sum[rt]=;//初始颜色为2
return ;
}
int mid = (l + r) >> ;
build(lson);
build(rson);
PushUp(rt);
}
void update(int L,int R,int c,int l,int r,int rt)
{
if (L <= l && r <= R)
{
add[rt] =<<(c-);//位运算左移表示有某种颜色
sum[rt] =<<(c-);
return ;
}
PushDown(rt , r - l + );//----延迟标志域向下传递
int mid = (l + r) >> ;
if (L <= mid)
update(L , R , c , lson);//更新左儿子
if (mid < R)
update(L , R , c , rson);//更新右儿子
PushUp(rt);
}
LL query(int L,int R,int l,int r,int rt)
{
if (L <= l && r <= R)
{
return sum[rt];
}
//要取rt子节点的值时,也要先把rt的延迟标记向下移动
PushDown(rt , r - l + );
int mid = (l + r) >> ;
LL ret = ;
if (L <= mid)
ret |= query(L , R , lson);
if (mid < R)
ret |= query(L , R , rson);
return ret;
}
int main()
{
int N , Q;
int a , b , c;
while(scanf("%d%d",&N,&Q))
{
if(N== && Q==)
break;
build( , N , );//建树
while(Q--)//Q为询问次数
{
char op[];
scanf("%s",op);
if(op[] == 'Q')//Q为询问次数
{
scanf("%d%d",&a,&b);
LL tt=query(a , b , , N , );
LL flag = ;
for(int i=; i<=; i++)
{
if(tt>>(i-)& && flag==)
{
printf("%d",i);
flag = ;
}
else if(tt>>(i-)&)
printf(" %d",i);
}
printf("\n");
}
else
{
scanf("%d%d%d",&a,&b,&c);
update(a , b , c , , N , );
}
}
}
return ;
}

hdu - 5023 - A Corrupt Mayor's Performance Art(线段树)的更多相关文章

  1. 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 ...

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

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

  3. 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 ...

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

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

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

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

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

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

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

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

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

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

  9. A Corrupt Mayor's Performance Art(线段树区间更新+位运算,颜色段种类)

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

随机推荐

  1. 在你的Android手机上运行Linux

    之前试过许多方法(也就几种),像什么Complete Linux Installer,Debian noroot,利用已有的Linux构造Bootstrap之类,要么就是复杂得要命(调了两天没有调出来 ...

  2. MySql索引笔记

    MySQL 索引是什么 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和 ...

  3. Python 函数递归-三元表达式-列表生成式-字典生成式-匿名函数-内置函数

    上节课复习: 1. 无参装饰器 def 装饰器名字(func): def wrapper(*args,**kwargs): res = func(*args,**kwargs) return res ...

  4. linux core dump 生成和调试

    core dump 某些信号的产生会导致产生core dump,包含了进程终止时的内存镜像.在某些时候这个core文件就非常的有用处,配合gdb或者lldb调试起来非常方便. 更详细的文档参考 Lin ...

  5. 使用js生成条形码以及二维码

    一.用js生成条形码这种业务场景不是很常见的,最近刚好又接到这种需求 Google一下,发现github还真有这方面的轮子,感谢github,省去了我们很多造轮子的过程, 好了言归正传,首先引入jsb ...

  6. 将json格式转为url参数格式的方法(xjl456852整理修改)

    测试页面: <html> <head> <script type="text/javascript" src="jquery-1.11.3. ...

  7. 关于自定义checkbox-radio标签的样式的方法(label 和 background-position理解)

    label label标签有一个很好的作用就是扩大表单控件元素的点击区域. 一般有两种方法可以达到效果:(1)使用label标签包裹表单控件(2)设置label标签的for属性和表单的id属性一致 这 ...

  8. Python接口测试之unittest框架(五)

    Test-driven development(TDD)开发模式在今天已经不是什么新奇的事了,它的开发思维是在开发一个产品功能的时候,先 编写好该功能的测试代码,在编写开发比如,比如要写二个数相除的函 ...

  9. CodeForcesGym 100517I IQ Test

    IQ Test Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForcesGym. Orig ...

  10. 解决Codeforces访问慢的本地方案

    参考: http://m.blog.csdn.net/blog/Xiangamp/42245923#