poj 2777(线段树的节点更新策略)
/*
之前的思想是用回溯的方式进行颜色的更新的!如果用回溯的方法的话,就是将每一个节点的颜色都要更新
通过子节点的颜色情况来判断父节点的颜色情况 !这就是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(线段树的节点更新策略)的更多相关文章
- poj 2777 线段树的区间更新
Count Color Time Limit: 1000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java ...
- poj 3648 线段树成段更新
线段树成段更新需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候.延迟标记的意思是:这个区间的左右儿子都需要被更新,但是当 ...
- poj 2777(线段树+lazy思想) 小小粉刷匠
http://poj.org/problem?id=2777 题目大意 涂颜色,输入长度,颜色总数,涂颜色次数,初始颜色都为1,然后当输入为C的时候将x到y涂为颜色z,输入为Q的时候输出x到y的颜色总 ...
- poj 2777线段树应用
敲了n遍....RE愉快的debug了一晚上...发现把#define maxn = 100000 + 10 改成 #define maxn = 100010 就过了....感受一下我呵呵哒的表情.. ...
- POJ 2777——线段树Lazy的重要性
POJ 2777 Count Color --线段树Lazy的重要性 原题 链接:http://poj.org/problem?id=2777 Count Color Time Limit: 1000 ...
- POJ 2777(线段树)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42507 Accepted: 12856 Des ...
- POJ 3468 线段树 成段更新 懒惰标记
A Simple Problem with Integers Time Limit:5000MS Memory Limit:131072K Case Time Limit:2000MS Descr ...
- Count Color POJ - 2777 线段树
Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds ...
- POJ 2777 线段树基础题
题意: 给你一个长度为N的线段数,一开始每个树的颜色都是1,然后有2个操作. 第一个操作,将区间[a , b ]的颜色换成c. 第二个操作,输出区间[a , b ]不同颜色的总数. 直接线段树搞之.不 ...
随机推荐
- 动态代理模式和AOP探究
java强大的反射机制给动态代理带来了可能.能够自由穿梭在类与方法之间.简直神通广大. 动态代理的一个小例子,顺便看看神奇的AOP是如何实现的.代码如下: 首先声明的是一个接口Dog类 package ...
- 树莓派安装RASPBIAN系统
买了个树莓派3B,安装Raspbian时出现问题,能ping通,但是无法建立ssh链接!对于我这种只有网线和电源的玩家来说打击太大. 找了一下原因,如下链接所述: http://downloads.r ...
- 一些有用的Javascript Function :-)
1.验证完整的日期格式:(yyyy-MM-dd)function checkDate(RQ) { var date = RQ; var result = date.match(/^(\d{1,4})( ...
- 头部加mead(便于seo优化)
<meta name="Keywords" content="关键词,关键词" /> <meta name="description ...
- Silverlight5中横向显示ListBox
备忘 <ListBox x:Name="Cpbrow" HorizontalAlignment="Left" Height="153" ...
- C++混合编程之idlcpp教程Lua篇(9)
上一篇在这 C++混合编程之idlcpp教程Lua篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程LuaTutorial7中除了四个文件LuaTutorial7.c ...
- Hibernate自动创建表
只要在hibernate.cfg.xml添加这句话,就可以自动生成数据表 <property name="hibernate.hbm2ddl.auto">update& ...
- Restful.Data,现招募有为骚年,群号 338570336
光阴似箭,日月如梭,套用小学作文惯用的一句开场白来开始重新开始我的博客园生涯吧. 8年的风霜雪雨,不断的击打着我内心的哀伤,可我依旧坚挺的屹立在这里,是因为技术是我一直坚持的梦想. 追寻着先辈和高人的 ...
- ENode 2.0 - 介绍一下关于ENode中对Command的调度设计
CQRS架构,C端的职责是处理从上层发送过来的command.对于单台机器来说,我们如何尽快的处理command呢?本文想通过不断提问和回答的方式,把我的思考写出来. 首先,我们最容易想到的是使用多线 ...
- 人人都是 DBA(I)SQL Server 体系结构
在了解 SQL Server 数据库时,可以先从数据库的体系结构来观察.SQL Server 的体系结构中包含 4 个主要组成部分: 协议层(Protocols) 关系引擎(Relational En ...