hdu - 5023 - A Corrupt Mayor's Performance Art(线段树)
题目原文废话太多太多太多,我就不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(线段树)的更多相关文章
- 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 ...
- HDU 5023 A Corrupt Mayor's Performance Art 线段树区间更新+状态压缩
Link: http://acm.hdu.edu.cn/showproblem.php?pid=5023 #include <cstdio> #include <cstring&g ...
- 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 ...
- ACM学习历程—HDU 5023 A Corrupt Mayor's Performance Art(广州赛区网赛)(线段树)
Problem Description Corrupt governors always find ways to get dirty money. Paint something, then sel ...
- HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...
- HDU5023:A Corrupt Mayor's Performance Art(线段树区域更新+二进制)
http://acm.hdu.edu.cn/showproblem.php?pid=5023 Problem Description Corrupt governors always find way ...
- HDU 5023 A Corrupt Mayor's Performance Art (据说是线段树)
题意:给定一个1-n的墙,然后有两种操作,一种是P l ,r, a 把l-r的墙都染成a这种颜色,另一种是 Q l, r 表示,输出 l-r 区间内的颜色. 析:应该是一个线段树+状态压缩,但是我用s ...
- 2014 网选 广州赛区 hdu 5023 A Corrupt Mayor's Performance Art
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #d ...
- A Corrupt Mayor's Performance Art(线段树区间更新+位运算,颜色段种类)
A Corrupt Mayor's Performance Art Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100 ...
随机推荐
- centos下安装redis(记录其中踩坑的过程)
一.先下载到redis-3.0.4.tar.gz包(本文以3.0.4版本为例) 我将这个包放在/opt目录下,在/opt下并解压这个包 tar -zxvf redis-.tar.gz 然后进入redi ...
- nginx配置错误页面
有时候页面会遇到404页面找不到错误,或者是500.502这种服务端错误,这时候我们可能希望自己定制返回页面,不希望看到默认的或者是内部的错误页面,可以通过nginx配置来实现. 1 50x错误对于5 ...
- leds-gpio driver 续1
在上文中分析了gpio-led platform_device是如何定义并注册的. 那么gpio-led platform_device 和 gpio-led platform_driver是如何匹配 ...
- CODE【VS】3160 最长公共子串 (后缀自动机)
3160 最长公共子串 题目描述 Description 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 输入描述 Input Description 读入两个字符串 输出描述 Outp ...
- 使用java发送电子邮件
经常在账号绑定邮箱或找回密码时,邮箱会收到一条验证邮件,好奇用代码该怎么发送邮件,看到了许多相关的博客,实现步骤都写的很详细,今天照着其他博客的步骤也确实实现了代码发送邮件,在这里重新记录下步骤,加深 ...
- JDBC--JAVA数据库连接相关
JDBC API提供了以下接口和类: DriverManager: 这个类管理数据库驱动程序的列表.确定内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连接请求.识别JDBC在一定 ...
- intellij idea 忽略文件不提交
文件已经纳入版本管理 如果文件已经纳入版本了,应该采用此方法 此方法主要应对文件已经纳入版本管理,但不想再提交,比如,不小心提交的eclipse.intellij的文件,以后不想再提交了,这种就通过v ...
- HDU 5458 Stability
Stability Time Limit: 2000ms Memory Limit: 102400KB This problem will be judged on HDU. Original ID: ...
- [HDU2136] Largest prime factor(素数筛)
传送门 题意 给出若干个数n(n<=1000000),求每个n的最大质因子的排名. 质数的排名:如果素数p是第k小的素数,那么p的排名就是k. 思路 乍一看不知道怎么搞. 其实可以想想我们怎么筛 ...
- 2.5 3-way quickSort
1.排序时,数组含有大量重复元素,应该使用哪种排序手段? (1)mergeSort:与数组的特征无关,比较次数总是在1/2NlgN~NlgN之间 (2)quickSort:当所有的元素全都相同的时候, ...