/*
之前的思想是用回溯的方式进行颜色的更新的!如果用回溯的方法的话,就是将每一个节点的颜色都要更新
通过子节点的颜色情况来判断父节点的颜色情况 !这就是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. UIAlertController的使用

    在iOS8中,苹果对UIAlertView和UIActionSheet进行了重新的封装,成为适应性更强,灵活性更高的UIAlertController.具体使用方法如下. UIAlertControl ...

  2. C++的一个奇技淫巧

    C++如何写一个函数,得到一个数组的长度呢? size_t GetArrayLength(int Array []) { return sizeof(Array)/sizeof(Array[0]);  ...

  3. eclipse tomcat集成开发,修改server.xml

    根据需求,需要修改server.xml文件,用于更改tomcat的运行方式.发现修改后,在eclipse中发布项目,server.xml的修改又被恢复了.网上找了n多资料只了解到eclipse维护自己 ...

  4. 【整理】--【字符设备】分配设备号register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()

    (1) 分配设备编号,注册设备与注销设备的函数均在fs.h中声明,如下: extern int register_chrdev_region(dev_t,unsigned int,const char ...

  5. java中类型转换

    1.基本数据类型转换    char, byte,short,int,long,float,double,boolean (1)小类型数据可以直接赋给大类型数据          例:char a=' ...

  6. java——多线程——内部类共享同一个外部类对象的成员变量

    public class Shop { public static void main(String[] args) { Outer o=new Outer(); Thread t1=o.getSal ...

  7. Linux(centeros)下安装jdk

    首先需要说明的是有的Linux系统自带jdk,这个jdk是openjdk,可以通过java-version查看 所以安装的步骤是,首先删除系统自带的(如果有)openjdk 1. rpm -qa | ...

  8. [leetcode 34] search for a range

    1 题目: Given a sorted array of integers, find the starting and ending position of a given target valu ...

  9. Xamarin.Android绑定库分享

    使用Xamarin.Android时,会用到各种第三方库,而这些库基本上是java编写的,要在Xamarin.Android中使用这些库,就需要通过Android Binding Project绑定对 ...

  10. 作业七:团队项目——Alpha版本冲刺阶段-14

    组内成员进行测试,对一些小问题进行了修改.