/*
之前的思想是用回溯的方式进行颜色的更新的!如果用回溯的方法的话,就是将每一个节点的颜色都要更新
通过子节点的颜色情况来判断父节点的颜色情况 !这就是TLE的原因! 后来想一想没有必要 !加入[a, b] 区间有p管辖,那么tree[p]的颜色值就是[a, b]所有点的颜色值!
如果[a,b]的子区间[c,d]没被跟新,那么tree[p]也是[c,d]的值!
否则,在更新[c,d]区间的时候,一定会经过 p 点!然后由上到下更新p<<1 和 p<<1|1 的值!
当找到[c,d]区间所对应的p‘时,并更新p’的值!、 之前的剪枝是点返回, 后面的是线段返回,当然更快!
*/
#include<string>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define M 100005
using namespace std; int tree[*M]; int color[];
int L, T, O; void buildT(int ld, int rd, int p){
if(ld<=rd){
tree[p]=;
if(ld==rd)
return ;
int mid = (ld+rd)/;
buildT(ld, mid, p<<);
buildT(mid+, rd, p<<|);
}
} void updateT(int ld, int rd, int a, int b, int p, int k){
if(tree[p] == k) return ;//如果当前更新的颜色和 之前p所管辖的区间的颜色相同,则返回 if(ld==a && rd==b){//p所管辖的区间的点的颜色全部是k!如果其子区间的颜色被更改,那么
tree[p]=k; //在更新子区间的时候一定会经过 p点,让后通过p更新 p<<1 和 p<<1|1 子区间的颜色!
return ;
} if(tree[p]!=-){//也就是在经过父节点时更新子节点的颜色状态,也就是[a,b]包含在 p点所管辖的区间内
tree[p<<] = tree[p<<|] = tree[p];
tree[p]=-;
}
if(ld<rd){
int mid = (ld+rd)/;
if(mid<a)
updateT(mid+, rd, a, b, p<<|, k);
else if(mid>=b)
updateT(ld, mid, a, b, p<<, k);
else{
updateT(ld, mid, a, mid, p<<, k);
updateT(mid+, rd, mid+, b, p<<|, k);
}
}
} void queryT(int ld, int rd, int a, int b, int p){
if(ld>rd) return ;
if(tree[p]!=-){
color[tree[p]]=;
}
else{
int mid = (ld+rd)/;
if(mid<a)
queryT(mid+, rd, a, b, p<<|);
else if(mid>=b)
queryT(ld, mid, a, b, p<<);
else{
queryT(ld, mid, a, mid, p<<);
queryT(mid+, rd, mid+, b, p<<|);
}
}
} int main(){ while(scanf("%d%d%d", &L, &T, &O)!=EOF){
buildT(, L, );
while(O--){
char ch[];
int a, b, c;
scanf("%s", ch);
if(ch[]=='C'){
scanf("%d%d%d", &a, &b, &c);
if(a>b){
a^=b;
b^=a;
a^=b;
}
updateT(, L, a, b, , c);
}
else{
scanf("%d%d", &a, &b);
if(a>b){
a^=b;
b^=a;
a^=b;
}
memset(color, , sizeof(color));
queryT(, L, a, b, );
int cnt=;
for(int i=; i<=T; ++i)
if(color[i]) ++cnt;
printf("%d\n", cnt);
}
}
}
return ;
}

poj 2777(线段树的节点更新策略)的更多相关文章

  1. poj 2777 线段树的区间更新

    Count Color Time Limit: 1000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java ...

  2. poj 3648 线段树成段更新

    线段树成段更新需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候.延迟标记的意思是:这个区间的左右儿子都需要被更新,但是当 ...

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

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

  4. poj 2777线段树应用

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

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

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

  6. POJ 2777(线段树)

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

  7. POJ 3468 线段树 成段更新 懒惰标记

    A Simple Problem with Integers Time Limit:5000MS   Memory Limit:131072K Case Time Limit:2000MS Descr ...

  8. Count Color POJ - 2777 线段树

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

  9. POJ 2777 线段树基础题

    题意: 给你一个长度为N的线段数,一开始每个树的颜色都是1,然后有2个操作. 第一个操作,将区间[a , b ]的颜色换成c. 第二个操作,输出区间[a , b ]不同颜色的总数. 直接线段树搞之.不 ...

随机推荐

  1. [转]Maven 划分模块

    所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作多模块,multi-module)相互关联.那么,为什么要这么做呢?我们明明在开发一 ...

  2. HTML5-表格

    表格:表头<caption>,行<tr>,列<td>,标题<th> 属性:cellpadding="10" cellspacing= ...

  3. RHEL5.8的NFS配置文件

    RHEL5.8的NFS配置文件 路径:/etc/sysconfig/nfs # # Define which protocol versions mountd # will advertise. Th ...

  4. SSIS内存不足

    [SSIS.Pipeline] 信息: 缓冲区管理器检测到系统的虚拟内存不足,但无法换出任何缓冲区.考虑了 0 个缓冲区,锁定了 0 个缓冲区.或者是因未安装足够的内存或其他进程正在使用内存,以致于没 ...

  5. 奇妙的动态代理:EF中返回的对象为什么序列化失败

    今天有如鹏的学生遇到一个问题:把一个对象保存到Session中(进程外Session)后,Web服务器重启,当从Session读取这个对象的时候报错,提示是一个“T_Users”后面跟着一大串数字的类 ...

  6. git 本地库提交至远程服务器

    1. git init 2. git add . 3. git commit -am "###"      -------以上3步只是本地提交 4.git remote add o ...

  7. 深入理解openstack网络架构(1)

    原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture 译文转载自:http://b ...

  8. Java多线程10:ThreadLocal的作用及使用

    ThreadLocal的作用 从上一篇对于ThreadLocal的分析来看,可以得出结论:ThreadLocal不是用来解决共享对象的多线程访问问题的,通过ThreadLocal的set()方法设置到 ...

  9. Java提高篇(三五)-----Java集合细节(一):请为集合指定初始容量

    集合是我们在Java编程中使用非常广泛的,它就像大海,海纳百川,像万能容器,盛装万物,而且这个大海,万能容器还可以无限变大(如果条件允许).当这个海.容器的量变得非常大的时候,它的初始容量就会显得很重 ...

  10. 面向对象架构模式之:领域模型(Domain Model)

    一:面向对象设计中最简单的部分与最难的部分 如果说事务脚本是 面向过程 的,那么领域模型就是 面向对象 的.面向对象的一个很重要的点就是:“把事情交给最适合的类去做”,即:“你得在一个个领域类之间跳转 ...