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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言计算机编程例题详解,计算机C语言编写程序题及答案解析精选.doc

计算机C语言编写程序题及答案解析精选2011年计算机二级C语言编写程序题及答案解析精选【4.1】已知银行整存整取存款不同期限的月息利率分别为&#xff1a;0.315% 期限一年0.330% 期限二年月息利率 &#xff1d; 0.345% 期限三年0.375% 期限五年0.420% 期限八年要求输入存钱的本…

mfsort shell语法_Shell中字符串排序的几种方法

Shell中字符串排序的几种方法【方法一】按ASCII正向排序备注:1) tr将子字符串中的空白转换为换行符&#xff0c;再用sort排序2) sort无参的话&#xff0c;默认按ASCII正向排序【方法二】按ASCII正向排序备注:1) -r参数: 按ASCII码反向排序2) 在使用sort,uniq等组合命令时候【方…

java中并不是任意多个接口都可以实现多实现

interface A{public abstract void show(); }interface B{public abstract int show(); }public class Test implements A, B{public void show(){System.out.println("A show!");}/*只写 void show&#xff08;&#xff09;出现的问题&#xff1a;Test不是抽象的, 并…

变形监测期末复习_寒假即将来临,中小学期末考试时间是什么时候?

2019年下学期也快结束&#xff0c;各个区的中小学考试时间安排已经公布了。今年&#xff0c;初二将首次进行全市统考&#xff0c;统考的意义重大&#xff0c;希望家长们可以督促孩子们重视起来&#xff0c;考出好成绩!下面&#xff0c;让我们来看一下2019下学期深圳各区中小学期…

c语言2048项目报告,c语言----项目_小游戏2048

2048 小游戏 主要是针对逻辑思维的一个训练.主要学习方面:1.随机数产生的概率.2.行与列在进行移动的时候几种情况.3.messagebox的使用#include #include #include #include using namespace std;int board[4][4] {0}; //二维数组int if_need_rand; //是否生成随机数int if_gam…

java中的显示初始化和特定初始化

public class Test{public static void main(String[] args){Child child new Child();} }class Parent{public Parent(){super();show();//this.show(); 因为是Child类对象调用了super()来构造其父类的部分;所以父类中的this&#xff08;随着其构造方法入栈的&#xff09;是指…

etl工程师 面试题_数据仓库工程师面试题笔试.doc

数据仓库工程师面试题姓名&#xff1a;____张小核______ 开始时间&#xff1a;_____:______ 结束时间&#xff1a;_____:_____数据库使用过哪些数据库&#xff1f;试说出它们的异同。答&#xff1a;使用过SQL SERVER和ORACLE它们的区别是&#xff1a;1.sql server 是中小型企业…

为什叫c语言,为什么c语言叫c语言?

1972年&#xff0c;美国贝尔实验室的 D.M.Ritchie 在B语言的基础上最终设计出了一种新的语言&#xff0c;他取了BCPL的第二个字母作为这种语言的名字&#xff0c;这就是C语言。1973年初&#xff0c;C语言的主体完成。Thompson和Ritchie用它完全重写了UNIX。随着UNIX的发展&…

java中对象的初始化过程

class Parent{int num 8;// ->3Parent(){//super(); // ->2//显示初始化 // ->3//构造代码段 // ->4show(); // ->5}{// ->4System.out.println("Parent constructor code run->");}public void show(){//被覆盖System.out.println(&quo…

马斯克翻跟头机器人_马斯克又搞事情 用VR训练机器人模仿人类动作

据该公司的开发者介绍&#xff1a;“我们已经研发了一款新算法——单次模仿学法算法。” 人们先在VR中完成一次操作&#xff0c;随后机器人通过观看视频来模仿人类的行为。为了证明该算法&#xff0c;设计者进行了堆叠彩色方块实验。人类在VR环境中按顺序移动方块。机器人首先通…

c语言通过指针变量输出10个元素,C语言程序设计第2版指针程序设计(10页)-原创力文档...

C 语言程序设计 - 理论方法与实践(第 2 版) 7.4.1 简单指针变量作函数参数 例 7-9 用比较交换法 &#xff0c;将一维数组的最 大值移到数组的最 末元素位置&#xff0c;交换 过程用上述 swap() 函数实现。 #include int main() { void swap(int *,int *); int i,a[10]{33,-12,9…

java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况

/* 样例1&#xff1a;class Parent{int num 3;}class Child extends Parent{int num 4;} *//* 样例2&#xff1a; class Parent{}class Child extends Parent{int num 4; } *//* 样例3&#xff1a; class Parent{void show(){System.out.println("Parent Show!");…

gddr6速率_Rambus展示18GT/s的GDDR6内存子系统:高频信号纯净度仍然非常好

Rambus最近展示了他们最新的GDDR6内存子系统&#xff0c;把传输速率提升到了18GT/s&#xff0c;而目前的市场上的GDDR6显存多为14GT/s&#xff0c;少数为16GT/s&#xff0c;18GT/s对于Rambus和GDDR6来说都是一个新的记录。在18GT/s的传输速率下&#xff0c;单颗位宽为32-bit的G…

桶排序算法c语言10个数组,桶排序算法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼//2.21 桶排序#include#include#define SIZE 100void bucket_sort(unsigned *,int);//桶排序函数的原型void print(unsigned *,int);//打印函数的原型int main(){unsigned array[SIZE];int i0;//为数组元素随机赋值for(i0;iarray[i…

diabetes影响因子2017_Journal of Diabetes

英文简介&#xff1a;Journal of Diabetes (JDB) devotes itself to diabetes research, therapeutics, and education. It aims to involve researchers and practitioners in a dialogue between East and West via all aspects of epidemiology, etiology, pathogenesis, ma…

java中泛型上限,下限应用

v 一.程序中无形之中用到的泛型import java.util.*; class Person implements Comparable<Person>{String name;int age;Person(){name "";age 0;}Person(String name, int age){this.name name;this.age age;}public String toString(){return name &quo…

株洲c语言培训机构,株洲好就业的学c语言程序设计,计算机专业地址

株洲好就业的学c语言程序设计衡阳市潇湘职业中等专业学校是由衡阳市教育主管&#xff0c;在衡阳校区的基础上设置的一所综合性全日制中等职业学校。坐落在国内优秀旅游城市、国内高新技术产业基地、名人辈出的全国历史文化名城-----衡阳市。我校依托长沙医校院&#xff0c;实现…

er图外键怎么表示_本周话题:取消考研复试最能实现相对公平?你怎么看?

2020取消研究生复试的呼声越来越高&#xff1f;考研er们&#xff1a;压力太大&#xff01;近日&#xff0c;红网作者李诗元的一篇《取消考研复试最能实现相对公平》引起热议国家线的出台和调剂系统5月20日的才开的通知让大家直接炸开了郭就山西大学来说 往年都是调剂生和一志愿…

java中匿名类的注意细节

abstract class Outer{int num;public Outer(int x){num x;}public abstract void show1();public abstract void show2(); }public class PC{public static void main(String[] args){new Outer(55)//构造父类部分//子类重写部分{public void show1(){System.out.println(num…

ios沙箱模式开启_iOS沙盒篇

iOS系统在安全性上的一大亮点就是沙盒。每个iOS应用SDK都被限制在沙盒中&#xff0c;我们可以把沙盒当成一个设置了仅当前SDK可以访问的文件夹&#xff0c;苹果对沙盒有以下几条限制&#xff1a;应用程序可以在自己的沙盒中运行&#xff0c;但不能访问任何其他应用程序的沙盒。…