题意:

给你一个长度为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 线段树基础题的更多相关文章

  1. POJ 3468 线段树裸题

    这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...

  2. hdu 1754 I Hate It 线段树基础题

    Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求, ...

  3. poj 2777(线段树+lazy思想) 小小粉刷匠

    http://poj.org/problem?id=2777 题目大意 涂颜色,输入长度,颜色总数,涂颜色次数,初始颜色都为1,然后当输入为C的时候将x到y涂为颜色z,输入为Q的时候输出x到y的颜色总 ...

  4. POJ 2777——线段树Lazy的重要性

    POJ 2777 Count Color --线段树Lazy的重要性 原题 链接:http://poj.org/problem?id=2777 Count Color Time Limit: 1000 ...

  5. hdu 1166 敌兵布阵(线段树基础题)

    学习线段树~~~~~~~~~~~~要好好理解 此题是单点更新的线段树,考虑基本的询问,更新. #include <iostream> #include <algorithm> ...

  6. POJ - 3264 线段树模板题 询问区间最大最小值

    这是线段树的一个模板题,给出一串数字,然后询问区间的最大最小值. 这个其实很好办,只需把线段树的节点给出两个权值,一个是区间的最小值,一个是区间的最大值,初始化为负无穷和正无穷,然后通过不断地输入节点 ...

  7. poj 2777线段树应用

    敲了n遍....RE愉快的debug了一晚上...发现把#define maxn = 100000 + 10 改成 #define maxn = 100010 就过了....感受一下我呵呵哒的表情.. ...

  8. POJ 2777(线段树)

    Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42507   Accepted: 12856 Des ...

  9. Count Color POJ - 2777 线段树

    Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds ...

随机推荐

  1. 分布式配置管理平台 Disconf

    Distributed Configuration Management Platform(分布式配置管理平台) 专注于各种 分布式系统配置管理 的通用组件/通用平台, 提供统一的配置管理服务. 包括 ...

  2. MB_CHANGE_DOCUMENT使用方法

    REFRESH IT_MSEG.             CLEAR IT_MSEG. SELECT * INTO CORRESPONDING FIELDS OF TABLE IT_MSEG      ...

  3. Flex 全屏显示方法

    1,修改html-template下的index.template.html文件…增加四行 1</html> 上述文件增加了四行…见我文中有提示 2,Mxml文件: 假如一个button按 ...

  4. Qt5官方demo分析集11——Qt Quick Particles Examples - Affectors

    在这个系列中的所有文章都可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集10--Qt ...

  5. 在CheckBox中,仅仅允许选择一项

    作用相当于RadioButonList <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=" ...

  6. JDBC----数据库连接池(connection pool)

    •数据库连接池的基本思想就是为数据库连接建立一个"缓冲池".预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从"缓冲池"中取出一个,使用完毕之后再 ...

  7. MySql 初次安装登陆

    名称:随便写 服务器:127.0.0.1或者localhost 端口:在安装mysql应该看到是3306 用户:root 密码:(默认的是空,如果你设置过自己应该知道) 其他就可以不用设置

  8. C语言循环小技巧

    写代码,有两类追求,一种是追求实用(Coder),一种是追求代码艺术(Artist) 我是那种追实用追腻了,偶然追一下艺术(就是偶然和艺术有一腿)的那种Coder 很多人,已经习惯了for(i=0; ...

  9. Web调试利器fiddler使用

    fiddler官网:http://fiddler2.com/ http://wenku.baidu.com/view/053e79d776a20029bd642dc1 http://www.cnblo ...

  10. java学习之二叉树的实现

    二叉树是一种数据结构,每个节点都有两个子节点. 二叉树的遍历有三种方式, 先序遍历是 根节点,左子树,右子树: 中序遍历是 左子树,根节点,右子树: 后序遍历是 左子树,右子树,根节点: java实现 ...