POJ 2777 线段树基础题
题意:
给你一个长度为N的线段数,一开始每个树的颜色都是1,然后有2个操作。
第一个操作,将区间[a , b ]的颜色换成c。
第二个操作,输出区间[a , b ]不同颜色的总数。
直接线段树搞之。不过输入有个坑,a 可能大于b ,所以要判断一下。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 2505
#define inf 1<<28
#define LL(x) (x<<1)
#define RR(x) (x<<1|1)
#define REP(i,s,t) for(int i=(s);i<=(t);++i)
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define mp(a,b) make_pair(a,b)
#define PII pair<int,int>
using namespace std; int L[1111111] , R[1111111] , data[1111111] , add[1111111] ;
int vis[1111] ;
int ans ;
int n , T ,O ;
void push_up(int x){
if(data[LL(x)] != data[RR(x)])
data[x] = 50 ;
else
data[x] = data[LL(x)] ;
}
void build(int l ,int r ,int u){
L[u] = l ;
R[u] = r ;
data[u] = 1 ;
add[u] = 0 ;
if(l == r)return ;
int mid = l + r >> 1 ;
build(l ,mid ,LL(u)) ;
build(mid + 1 ,r ,RR(u)) ;
} void push_down(int x){
if(add[x]){
add[LL(x)] = add[x] ;
add[RR(x)] = add[x] ;
data[LL(x)] = add[x] ;
data[RR(x)] = add[x] ;
add[x] = 0 ;
}
} void updata(int l ,int r ,int u ,int color){
push_down(u) ;
if(l > R[u] || r < L[u])return ;
if(l == L[u] && r == R[u]){
data[u] = color ;
add[u] = color ;
return ;
}
int mid = (L[u] + R[u]) >> 1 ;
if(r <= mid)updata(l , r , LL(u) ,color) ;
else if(l > mid)updata(l ,r ,RR(u) ,color) ;
else {
updata(l ,mid ,LL(u), color) ;
updata(mid + 1 ,r ,RR(u) ,color) ;
}
push_up(u) ;
} void query(int l ,int r ,int u){
push_down(u) ;
if(l > R[u] || r < L[u])return ;
if(l == L[u] && r == R[u]){
if(data[u] != 50){
if(!vis[data[u]]){
ans ++ ;
vis[data[u]] = 1 ;
}
return ;
}
}
int mid = L[u] + R[u] >> 1 ;
if(l > mid )query(l ,r , RR(u)) ;
else if(r <= mid)query(l, r ,LL(u)) ;
else {
query(l , mid ,LL(u)) ;
query(mid + 1 ,r ,RR(u)) ;
}
push_up(u) ;
}
inline void RD(int &ret) {
char c;
do {
c = getchar();
} while(c < '0' || c > '9') ;
ret = c - '0';
while((c=getchar()) >= '0' && c <= '9')
ret = ret * 10 + ( c - '0' );
}
void swap(int& a ,int& b){
int temp = a ;
if(a > b){
a = b ;
b = temp ;
}
}
void debug(){
for (int i = 1 ;i <= 3 * n ;i ++){
cout << "L:" << L[i] << "R:" << R[i] << "data:" << data[i] << "add:" << add[i] << endl;
}
}
int main() {
cin >> n >> T >> O ;
build(1 , n , 1 ) ;
int a , b , c ;
char op[11] ;
while(O -- ){
scanf("%s",op) ;
if(op[0] == 'C'){
scanf("%d%d%d",&a,&b,&c) ;
if( a > b)swap(a ,b ) ;
updata(a , b, 1 , c) ;
}
else if(op[0] == 'P'){
scanf("%d%d",&a,&b) ;
if(a > b)swap(a , b) ;
ans = 0 ;
mem(vis,0) ;
query(a , b , 1) ;
printf("%d\n",ans) ;
}
}
return 0 ;
}
POJ 2777 线段树基础题的更多相关文章
- POJ 3468 线段树裸题
这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...
- hdu 1754 I Hate It 线段树基础题
Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求, ...
- poj 2777(线段树+lazy思想) 小小粉刷匠
http://poj.org/problem?id=2777 题目大意 涂颜色,输入长度,颜色总数,涂颜色次数,初始颜色都为1,然后当输入为C的时候将x到y涂为颜色z,输入为Q的时候输出x到y的颜色总 ...
- POJ 2777——线段树Lazy的重要性
POJ 2777 Count Color --线段树Lazy的重要性 原题 链接:http://poj.org/problem?id=2777 Count Color Time Limit: 1000 ...
- hdu 1166 敌兵布阵(线段树基础题)
学习线段树~~~~~~~~~~~~要好好理解 此题是单点更新的线段树,考虑基本的询问,更新. #include <iostream> #include <algorithm> ...
- POJ - 3264 线段树模板题 询问区间最大最小值
这是线段树的一个模板题,给出一串数字,然后询问区间的最大最小值. 这个其实很好办,只需把线段树的节点给出两个权值,一个是区间的最小值,一个是区间的最大值,初始化为负无穷和正无穷,然后通过不断地输入节点 ...
- poj 2777线段树应用
敲了n遍....RE愉快的debug了一晚上...发现把#define maxn = 100000 + 10 改成 #define maxn = 100010 就过了....感受一下我呵呵哒的表情.. ...
- POJ 2777(线段树)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42507 Accepted: 12856 Des ...
- Count Color POJ - 2777 线段树
Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds ...
随机推荐
- 静态方法中为什么不能使用this
- ExpandableListView(二)替换箭头图标被拉伸的问题
之前写过一篇替换系统默认图标的文章,之后又发现了问题,当替换成自己的图片之后,图片被拉伸了!为了解决这个问题,我几乎尝试了所有方法,结果都不理想 我试过的方法,在布局里,把textview上的内容字体 ...
- linux内核源码阅读之facebook硬盘加速利器flashcache
从来没有写过源码阅读,这种感觉越来越强烈,虽然劣于文笔,但还是下定决心认真写一回. 源代码下载请参见上一篇flashcache之我见 http://blog.csdn.net/liumangxiong ...
- SVN使用技巧
安装 下载SVN服务端:VisualSVN Server https://www.visualsvn.com/downloads/ 安装,下一步...(更改地址,Location是安装目录,Repos ...
- 【转】Ubuntu 上编译Android出现cannot find -lstdc++解决办法
[转]Ubuntu 上编译Android出现cannot find -lstdc++解决办法 在Ubuntu 12.04 x86_64机器上编译Android出现下面错误,是因为找不到32bit的li ...
- 解决:Visual Assist X 不支持HTML、Javascript等提示
Visual Assist X 安装后,不能进行javascript hmtl提示,只有回到老版本才行.这个问题折腾了老久,才给解决了. 记录下来,以便于网友和自己使用. 问题原因: Visual A ...
- 初学MVC
学习MVC基础:C#. ADO.NET .html.javascript.ASP.Net .WebFrom MVC模式两种理解:一种是表现模式,另一种是架构模式.它将应用程序分成三个主要的组件:视图( ...
- 通过SSIS监控远程服务器磁盘空间并发送邮件报警
本文直接参考了博客园软件人生的文章操作的,写在这里只为做个记录. 到公司这边先把两个报表服务器接收了. 为防止宕机,部署个磁盘警告的SSIS包. Step 1 建立两个变量来接收和写入磁盘容量 Ste ...
- C# 读取Excel日期格式
读取Excel日期数据,一种方式是在EXCEL中把你的日期列的格式设置一下,设成"文本"型. 如果单元格格式设置为date,则在后台读出的数值是一个数值,如2008-08-08读出 ...
- BZOJ 1711: [Usaco2007 Open]Dingin吃饭( 最大流 )
将牛拆成两个点 i 和 i' 并连弧 , S 向每种 food 连边 , 每种 drink 向 T 连边 , 每种 food 向喜欢他的 cow 连边 到 i , 每种 drink 从喜欢它的 cow ...