A Corrupt Mayor's Performance Art(线段树区间更新+位运算,颜色段种类)
A Corrupt Mayor's Performance Art
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others) Total Submission(s): 1905 Accepted Submission(s): 668
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?
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.
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
3 4
4 7
4
4 7 8
题解:染色线段树,每次询问输出这段区间的颜色种类;位运算记录颜色;注意lazy传递的是相等,因为直接染色;
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#define LL long long
using namespace std;
#define ll root<<1
#define rr root<<1|1
#define lson ll, l, mid
#define rson rr, mid + 1, r
int ans;
const int MAXN = 1e6 + ;
int tree[MAXN << ];
int lazy[MAXN << ];
int p[];
void pushup(int root){
tree[root] = tree[ll] | tree[rr];
}
void pushdown(int root){
if(lazy[root]){
lazy[ll] = lazy[root];
lazy[rr] = lazy[root];
tree[ll] = lazy[root];
tree[rr] = lazy[root];
lazy[root] = ;
}
}
void build(int root, int l, int r){
lazy[root] = ;
int mid = (l + r) >> ;
if(l == r){
tree[root] = << ( - );
return;
}
build(lson);
build(rson);
pushup(root);
}
void update(int root, int l, int r, int L, int R, int C){
int mid = (l + r) >> ;
if(l >= L && r <= R){
tree[root] = << (C - );
lazy[root] = << (C - );
return;
}
pushdown(root);
if(mid >= L)update(lson, L, R, C);
if(mid < R)update(rson, L, R, C);
pushup(root);
}
void query(int root, int l, int r, int L, int R){
int mid = (l + r) >> ;
if(l >= L && r <= R){
ans |= tree[root];
return;
}
pushdown(root);
if(mid >= L)query(lson, L, R);
if(mid < R)query(rson, L, R);
}
int main(){
int N, M;
char s[];
while(scanf("%d%d", &N, &M), N|M){
build(, , N);
while(M--){
int l, r, c;
scanf("%s%d%d", s, &l, &r);
if(s[] == 'P'){
scanf("%d", &c);
update(, , N, l, r, c);
}
else{
ans = ;
int tp = , i = ;
query(, , N, l, r);
while(ans){
if(ans & )
p[tp++] = i;
i++;
ans >>= ;
}
for(int i = ; i < tp; i++){
if(i)printf(" ");
printf("%d", p[i]);
}
puts("");
}
}
}
return ;
}
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 ...
- 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 线段树
A Corrupt Mayor's Performance Art Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100 ...
- poj 2777 线段树 区间更新+位运算
题意:有一个长板子,分成多段,有两种操作,第一种是C给从a到b那段染一种颜色c,另一种是P询问a到b有多少种不同的颜色.Sample Input2 2 4 板长 颜色数目 询问数目C 1 1 2P ...
- POJ-2528 Mayor's posters (线段树区间更新+离散化)
题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...
- POJ-2528 Mayor's posters(线段树区间更新+离散化)
http://poj.org/problem?id=2528 https://www.luogu.org/problem/UVA10587 Description The citizens of By ...
- POJ 2528 Mayor's posters(线段树/区间更新 离散化)
题目链接: 传送门 Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Description The citizens of By ...
- POJ2528 Mayor's posters(线段树&区间更新+离散化)题解
题意:给一个区间,表示这个区间贴了一张海报,后贴的会覆盖前面的,问最后能看到几张海报. 思路: 之前就不会离散化,先讲一下离散化:这里离散化的原理是:先把每个端点值都放到一个数组中并除重+排序,我们就 ...
随机推荐
- iOS开发之Crash分析,以及收集
一 先谈谈iOS的Crash收集方式: 1. APP 发生crash,用户手机手机上肯定会有crash纪录,当然删除了该app,或是删了再装 crash纪录还是没了. 2. 如果用户设置-隐私 同 ...
- PHP设计模式笔记二:面向对象 -- Rango韩老师 http://www.imooc.com/learn/236
SPL标准库的使用 SPL是用于解决典型问题(standard problems)的一组接口与类的集合. 1.SPL提供了很多数据结构类,如SplStack.SqlQueue.SqlHeap.SplF ...
- C# 创建Windows服务。服务功能:定时操作数据库 (转)
C# 创建Windows服务.服务功能:定时操作数据库 一.创建window服务 1.新建项目-->选择Windows服务.默认生成文件包括Program.cs,Service1.cs 2.在S ...
- Oracle优化技术
1.基本原理 Oracle的日志:Oracle中为了提高硬盘写的效率,採用内存中数据缓冲区来保存数据,等到一定量或一定时间后才写到磁盘(DBWR). 这个时候假如断电之类的故障发生,数据缓冲区的数据将 ...
- CSS彻底研究(3) - 浮动,定位
Github pages 博文 CSS彻底研究(3)-浮动,定位 一 . 浮动float I . 定义及规则 float默认为none,对应标准流的情况.当float : left;时,元素就会向其父 ...
- 伪元素first-letter(首字母变大)
让首字母变大 <p>Do you like to ride a bicycle?</p> p:first-letter{ font-size: 34px; }
- js获取url参数的方法
js获取url参数的方法有很多. 1.正则分析 function getQueryString(name) { var reg = new RegExp("(^|&)" + ...
- PHP学习笔记十五【面向对象二】
<?php class Cat{ //public 访问修饰符 public $name; public $age; } //创建 $cat1=new Cat; $cat1->name=& ...
- appStore应用发布流程
原文转自: http://blog.sina.com.cn/s/blog_68661bd801019uzd.html 首先确定帐号是否能发布, https://developer.appl ...
- Python codes
Vertification of an assignment from Stochastic Processing. Using Brute Force and "itertools&quo ...