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(线段树的节点更新策略)相关推荐

  1. poj 2777(线段树+区间染色)

    解题思路:这道题利用了线段树+位运算的思想,由于颜色的种类只有30种,所以int可以存下来,所以我们在线段树的节点里面加上status的状态信息,表示这段区间内的颜色信息,而且我们可以知道,父节点的s ...

  2. POJ 2777 线段树

    一道线段树.lazy标记+位运算--(第一次写这个什么lazy标记,抄了一发题解) 我们发现:"或"操作在这里用正合适. 原题请戳这里 // by Sirius_Ren #incl ...

  3. HDU-1754 线段树的节点更新,储存区间的最大值

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

  4. uscao 线段树成段更新操作及Lazy思想(POJ3468解题报告)

    线段树成段更新操作及Lazy思想(POJ3468解题报告) 标签: treequerybuildn2cstruct 2011-11-03 20:37 5756人阅读 评论(0) 收藏 举报  分类: ...

  5. 线段树之单点更新,区域求和

    线段树之单点更新,区域求和 今天在coreforces上做的一题 E. DZY Loves Fibonacci Numbers time limit per test 4 seconds memory ...

  6. A Simple Problem with Integers POJ - 3468 (线段树)

    思路:线段树,区间更新,区间查找 1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #inc ...

  7. HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. java-HDU1698(线段树的区间更新,和区间查询)

    HDU1698: 题目意思: Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  9. HDOJ 1698 Just a Hook(线段树成段更新)

    题意: 屠夫的钩子区间是1~n,每段可能由铜,银,金组成,价值分别为1,2,3,进行一系列的更新之后,求钩子的总价值. 思路: 线段树的成段更新:要设置一个临时的线段树,每次更新的时候把更新段的值放在 ...

最新文章

  1. 从assemblyer Instructure deepth understander C principle
  2. hdu4740 Sum
  3. Laravel经常使用的语法总结
  4. [ZJOI2012]数列
  5. [html] 说说js代码写到html里还是单独写到js文件里哪个好?为什么?
  6. awk批量修改文件名,awk用法
  7. WebSecurityConfigurerAdapter详解
  8. fastapi学习(二):路径参数获取与GET、POST参数获取
  9. java类的实例参数传递_获取我正在通过参数传递的相同Java类实例
  10. 海量数据挖掘MMDS week1: Link Analysis - PageRank
  11. python练习题4
  12. 在Mac上如何更轻松的使用表情符号管理器
  13. 用ntsd -c q -p PID 杀进程
  14. 微信支付功能测试用例
  15. 字节跳动开源隐私合规检测工具appshark
  16. 奇迹暖暖服务器不稳定,奇迹暖暖有几个服务器
  17. 常见图片格式及其区别小结
  18. php 判断华为手机,一招教你如何看穿华为手机的内存类型
  19. 梯度爆炸与梯度消失是什么?有什么影响?如何解决?
  20. rtsp播放h265(hevc)

热门文章

  1. php 网站移动端自适应,HTML5 移动端自适应布局
  2. 网速dns怎么调快_怎么设置dns?教你快速解决网速慢的问题
  3. JsonData工具类
  4. SQL算法中的变量使用占位符动态赋值
  5. 2020洪灾地图_卫星地图看洪灾:为何湖北易发洪水?
  6. python多进程写入mysql_Python实现 多进程导入CSV数据到 MySQL
  7. python request url 转义_Python爬虫入门笔记
  8. mysql 查看root_Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
  9. highcharts ajax 数据格式,Highcharts ajax获取json对象动态生成报表生成 .
  10. qt点击按钮本身,来删除自身