poj 2777(线段树的节点更新策略)
1 /* 2 之前的思想是用回溯的方式进行颜色的更新的!如果用回溯的方法的话,就是将每一个节点的颜色都要更新 3 通过子节点的颜色情况来判断父节点的颜色情况 !这就是TLE的原因! 4 5 后来想一想没有必要 !加入[a, b] 区间有p管辖,那么tree[p]的颜色值就是[a, b]所有点的颜色值! 6 如果[a,b]的子区间[c,d]没被跟新,那么tree[p]也是[c,d]的值! 7 否则,在更新[c,d]区间的时候,一定会经过 p 点!然后由上到下更新p<<1 和 p<<1|1 的值! 8 当找到[c,d]区间所对应的p‘时,并更新p’的值!、 9 10 之前的剪枝是点返回, 后面的是线段返回,当然更快! 11 */ 12 #include<string> 13 #include<iostream> 14 #include<algorithm> 15 #include<cstring> 16 #include<cstdio> 17 #define M 100005 18 using namespace std; 19 20 21 int tree[4*M]; 22 23 int color[32]; 24 int L, T, O; 25 26 27 void buildT(int ld, int rd, int p){ 28 if(ld<=rd){ 29 tree[p]=1; 30 if(ld==rd) 31 return ; 32 int mid = (ld+rd)/2; 33 buildT(ld, mid, p<<1); 34 buildT(mid+1, rd, p<<1|1); 35 } 36 } 37 38 39 40 void updateT(int ld, int rd, int a, int b, int p, int k){ 41 if(tree[p] == k) return ;//如果当前更新的颜色和 之前p所管辖的区间的颜色相同,则返回 42 43 if(ld==a && rd==b){//p所管辖的区间的点的颜色全部是k!如果其子区间的颜色被更改,那么 44 tree[p]=k; //在更新子区间的时候一定会经过 p点,让后通过p更新 p<<1 和 p<<1|1 子区间的颜色! 45 return ; 46 } 47 48 if(tree[p]!=-1){//也就是在经过父节点时更新子节点的颜色状态,也就是[a,b]包含在 p点所管辖的区间内 49 tree[p<<1] = tree[p<<1|1] = tree[p]; 50 tree[p]=-1; 51 } 52 if(ld<rd){ 53 int mid = (ld+rd)/2; 54 if(mid<a) 55 updateT(mid+1, rd, a, b, p<<1|1, k); 56 else if(mid>=b) 57 updateT(ld, mid, a, b, p<<1, k); 58 else{ 59 updateT(ld, mid, a, mid, p<<1, k); 60 updateT(mid+1, rd, mid+1, b, p<<1|1, k); 61 } 62 } 63 } 64 65 void queryT(int ld, int rd, int a, int b, int p){ 66 if(ld>rd) return ; 67 if(tree[p]!=-1){ 68 color[tree[p]]=1; 69 } 70 else{ 71 int mid = (ld+rd)/2; 72 if(mid<a) 73 queryT(mid+1, rd, a, b, p<<1|1); 74 else if(mid>=b) 75 queryT(ld, mid, a, b, p<<1); 76 else{ 77 queryT(ld, mid, a, mid, p<<1); 78 queryT(mid+1, rd, mid+1, b, p<<1|1); 79 } 80 } 81 } 82 83 int main(){ 84 85 while(scanf("%d%d%d", &L, &T, &O)!=EOF){ 86 buildT(1, L, 1); 87 while(O--){ 88 char ch[2]; 89 int a, b, c; 90 scanf("%s", ch); 91 if(ch[0]=='C'){ 92 scanf("%d%d%d", &a, &b, &c); 93 if(a>b){ 94 a^=b; 95 b^=a; 96 a^=b; 97 } 98 updateT(1, L, a, b, 1, c); 99 } 100 else{ 101 scanf("%d%d", &a, &b); 102 if(a>b){ 103 a^=b; 104 b^=a; 105 a^=b; 106 } 107 memset(color, 0, sizeof(color)); 108 queryT(1, L, a, b, 1); 109 int cnt=0; 110 for(int i=1; i<=T; ++i) 111 if(color[i]) ++cnt; 112 printf("%d\n", cnt); 113 } 114 } 115 } 116 return 0; 117 }
转载于:https://www.cnblogs.com/hujunzheng/p/3872563.html
poj 2777(线段树的节点更新策略)相关推荐
- poj 2777(线段树+区间染色)
解题思路:这道题利用了线段树+位运算的思想,由于颜色的种类只有30种,所以int可以存下来,所以我们在线段树的节点里面加上status的状态信息,表示这段区间内的颜色信息,而且我们可以知道,父节点的s ...
- POJ 2777 线段树
一道线段树.lazy标记+位运算--(第一次写这个什么lazy标记,抄了一发题解) 我们发现:"或"操作在这里用正合适. 原题请戳这里 // by Sirius_Ren #incl ...
- HDU-1754 线段树的节点更新,储存区间的最大值
很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师 ...
- uscao 线段树成段更新操作及Lazy思想(POJ3468解题报告)
线段树成段更新操作及Lazy思想(POJ3468解题报告) 标签: treequerybuildn2cstruct 2011-11-03 20:37 5756人阅读 评论(0) 收藏 举报 分类: ...
- 线段树之单点更新,区域求和
线段树之单点更新,区域求和 今天在coreforces上做的一题 E. DZY Loves Fibonacci Numbers time limit per test 4 seconds memory ...
- A Simple Problem with Integers POJ - 3468 (线段树)
思路:线段树,区间更新,区间查找 1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #inc ...
- HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- java-HDU1698(线段树的区间更新,和区间查询)
HDU1698: 题目意思: Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDOJ 1698 Just a Hook(线段树成段更新)
题意: 屠夫的钩子区间是1~n,每段可能由铜,银,金组成,价值分别为1,2,3,进行一系列的更新之后,求钩子的总价值. 思路: 线段树的成段更新:要设置一个临时的线段树,每次更新的时候把更新段的值放在 ...
最新文章
- 从assemblyer Instructure deepth understander C principle
- hdu4740 Sum
- Laravel经常使用的语法总结
- [ZJOI2012]数列
- [html] 说说js代码写到html里还是单独写到js文件里哪个好?为什么?
- awk批量修改文件名,awk用法
- WebSecurityConfigurerAdapter详解
- fastapi学习(二):路径参数获取与GET、POST参数获取
- java类的实例参数传递_获取我正在通过参数传递的相同Java类实例
- 海量数据挖掘MMDS week1: Link Analysis - PageRank
- python练习题4
- 在Mac上如何更轻松的使用表情符号管理器
- 用ntsd -c q -p PID 杀进程
- 微信支付功能测试用例
- 字节跳动开源隐私合规检测工具appshark
- 奇迹暖暖服务器不稳定,奇迹暖暖有几个服务器
- 常见图片格式及其区别小结
- php 判断华为手机,一招教你如何看穿华为手机的内存类型
- 梯度爆炸与梯度消失是什么?有什么影响?如何解决?
- rtsp播放h265(hevc)
热门文章
- php 网站移动端自适应,HTML5 移动端自适应布局
- 网速dns怎么调快_怎么设置dns?教你快速解决网速慢的问题
- JsonData工具类
- SQL算法中的变量使用占位符动态赋值
- 2020洪灾地图_卫星地图看洪灾:为何湖北易发洪水?
- python多进程写入mysql_Python实现 多进程导入CSV数据到 MySQL
- python request url 转义_Python爬虫入门笔记
- mysql 查看root_Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
- highcharts ajax 数据格式,Highcharts ajax获取json对象动态生成报表生成 .
- qt点击按钮本身,来删除自身