版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 4348

题意:

  一个长度为n的数组,4种操作 :

    (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 。

    (2)Q l r:查询当前时间戳区间[l,r]中所有数的和 。

    (3)H l r t:查询时间戳t区间[l,r]的和 。

    (4)B t:将当前时间戳置为t 。

  所有操作均合法 。

解法:

  很明显是一道主席树的题 。

  对于每一次区间加法都新建节点建一棵线段树,加个懒惰标记就行了,查询的话直接线段树区间求和 。

  不过感觉这一题就是为可持续化数据结构写的,特别是时间戳这一点,当前时间戳的版本就是从上一个时间戳继承下来的,而且所有记录都保存了下来,好神奇,感觉对主席树的理解又加深了一点 。

code 主席树

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <algorithm>
  4 #include <cmath>
  5 #include <cstring>
  6 #include <queue>
  7 #include <set>
  8 #include <vector>
  9 #include <map>
 10 #define ll long long
 11
 12 using namespace std;
 13
 14 const int N=100000+7;
 15
 16 int root[N],tot;
 17 int Ls[N*30],Rs[N*30],add[N*30];
 18 ll sum[N*30];
 19
 20 int n,m;
 21
 22 inline int bulidtree(int L,int R){
 23     int k=tot++;
 24     add[k]=0;
 25
 26     if (L==R){
 27         scanf("%lld",&sum[k]);
 28         return k;
 29     }
 30
 31     int mid=(L+R)>>1;
 32     Ls[k]=bulidtree(L,mid);
 33     Rs[k]=bulidtree(mid+1,R);
 34
 35     sum[k]=sum[Ls[k]]+sum[Rs[k]];
 36
 37     return k;
 38 }
 39
 40 inline int update(int o,int L,int R,int x,int LL,int RR){
 41     int k=tot++;
 42     Ls[k]=Ls[o]; Rs[k]=Rs[o]; add[k]=add[o]; sum[k]=sum[o];
 43
 44     sum[k]+=(ll)x*(R-L+1);
 45
 46     if (LL==L && RR==R){
 47         add[k]+=x;
 48         return k;
 49     }
 50
 51     int mid=(LL+RR)>>1;
 52     if (R<=mid) Ls[k]=update(Ls[k],L,R,x,LL,mid);
 53     else if (L>mid) Rs[k]=update(Rs[k],L,R,x,mid+1,RR);
 54     else {
 55         Ls[k]=update(Ls[k],L,mid,x,LL,mid);
 56         Rs[k]=update(Rs[k],mid+1,R,x,mid+1,RR);
 57     }
 58
 59     return k;
 60 }
 61
 62 inline ll query(int o,int L,int R,int LL,int RR){
 63     if (L==LL && R==RR) return sum[o];
 64
 65     int mid=(LL+RR)>>1;
 66
 67     ll ret=(ll)add[o]*(R-L+1);
 68
 69     if (R<=mid) return ret+query(Ls[o],L,R,LL,mid);
 70     else if (L>mid) return ret+query(Rs[o],L,R,mid+1,RR);
 71     else return ret+query(Ls[o],L,mid,LL,mid)+query(Rs[o],mid+1,R,mid+1,RR);
 72 }
 73
 74 int main(){
 75     int x,L,R;
 76     int now;
 77     char ch[3];
 78
 79     bool f=false;
 80
 81     while (~scanf("%d%d",&n,&m)){
 82         if (f) puts("");
 83         else f=true;
 84
 85         tot=0;
 86         root[0]=bulidtree(1,n);
 87         now=0;
 88
 89         while (m--){
 90             scanf("%s",ch);
 91             if (ch[0]=='C') {
 92                 scanf("%d%d%d",&L,&R,&x);
 93                 now++;
 94                 root[now]=update(root[now-1],L,R,x,1,n);
 95             }
 96             else if (ch[0]=='Q') {
 97                 scanf("%d%d",&L,&R);
 98                 printf("%lld\n",query(root[now],L,R,1,n));
 99             }
100             else if (ch[0]=='H'){
101                 scanf("%d%d%d",&L,&R,&x);
102                 printf("%lld\n",query(root[x],L,R,1,n));
103             }
104             else if (ch[0]=='B') {
105                 scanf("%d",&now);
106             }
107         }
108     }
109
110     return 0;
111 }

转载于:https://www.cnblogs.com/without-ACM/p/5937261.html

hdu 4348 To the moon (主席树)相关推荐

  1. HDU - 4348 To the moon(主席树区间更新-标记永久化)

    题目链接:点击查看 题目大意:给出一个初始时长度为 n 的序列,有 m 次操作,每种操作分为下列四种类型: C l r d:新建一个继承了前一个版本的数组,并将区间 [ l , r ] 内的数字都加上 ...

  2. HDU 4348 To the moon(主席树区间修改)

    题意 给你一个区间,支持如下操作: 在一段区间内加上一个值,并生成一个历史版本 查询某个版本下一段区间内的和 回到一个历史版本上并舍弃之后的版本 做法 这就是主席树区间修改裸题啦QwQ 上一篇博客我讲 ...

  3. HDU - 4348To the moon——主席树+区间修改

    HDU - 4348To the moon [题目描述] [题目分析] 题目中说明每次更新后时间都会加1,而且还会需要查询以前的区间,还会需要返回以前的时间,所以是很裸的主席树.区间查询的话我们同样需 ...

  4. HDU - 6621 K-th Closest Distance——主席树+二分

    [题目描述] HDU - 6621 K-th Closest Distance [题目分析] 因为看到第kkk大的要求,刚开始的时候一直都在想怎么运用第kkk大来解决问题,但是后来看其他人的博客才发现 ...

  5. HDU - 6278 Just $h$-index主席树+二分

    HDU - 6278 Just hhh-index [题目描述] [题目分析] 题目要求在区间[l,r][l,r][l,r]内大于h的数不少于h个,对于这种最大化问题,我们应该想到二分. 最小情况显然 ...

  6. HDU 2852 KiKi's K-Number 主席树

    题意: 要求维护一个数据结构,支持下面三种操作: \(0 \, e\):插入一个值为\(e\)的元素 \(1 \, e\):删除一个值为\(e\)的元素 \(2 \, a \, k\):查询比\(a\ ...

  7. HDU - 4348 To the moon

    题意: 长度为N的序列,初始时间戳为0,有M次操作. C l r d:代表区间[l, r]的数加d,当前时间戳加1. Q l r:代表输出当前时间戳内[l, r]的区间和. H l r t:代表输出时 ...

  8. HDU 4348 To the moon

    HDU_4348 用可持久化线段树就可以实现O(1)的back操作,同时如果想效率比较高的话,推荐用单点修改+区间查询的模式替代下传标记的区间修改+区间查询的模式来完成对区间和的查询. 至于如何不下传 ...

  9. CSU-ACM集训-模板-主席树

    原hdu 2665 Kth number 题意 给\(n\)个数和\(m\)次查询,每个查询包含区间\([x,y]\),求区间内第\(K\)大的数 思路 可持久化线段树,即主席树,第一次建立一个空的线 ...

最新文章

  1. css03层次选择器
  2. 《PowerShell V3——SQL Server 2012数据库自动化运维权威指南》——1.5 安装SMO
  3. AMF(Action Message Format)其它语言对象转ActionScript对象[转]
  4. c语言中 c2059错误是,解决error C2059: 语法错误:“::”问题
  5. linux隔一级目录找文件,linux查看文件和子目录
  6. 多线多IP的服务器配置
  7. hdu 4781 Beautiful Soup 构造
  8. 使用FreeSWITCH SIP落地的配置总结
  9. Eucalyptus云之面纱
  10. windows 大容量存储设备驱动异常(代码:39)U盘由于驱动问题无法用的解决方法
  11. 〖Python APP 自动化测试实战篇⑤〗- appium Capability详解
  12. java excel 合并单元格_java excel 合并单元格
  13. 机器学习进阶——数据清洗
  14. 矩形中分出正方形,递归优化
  15. python文件操作和绘制曲线
  16. 数仓治理:数据地图长什么样?
  17. java每隔1分钟执行一次_启动系统定时器,每隔1分钟/指定时间执行任务 学习笔记...
  18. ZCash零知识证明
  19. 动力环境监控系统(动环监控功能特点)
  20. 自动驾驶需要哪些关键技术?

热门文章

  1. 地摊经济和夜经济-国情讲坛·周荣江:城市生态谋定治理转型
  2. openresty开发系列23--lua面向对象
  3. Probabilistic Principal Component Analysis
  4. HTML实现包含公共部分:通过ECMA6的模块化,纯前端实现类似jsp:include的功能
  5. Mybatis学习第一天——Mybatis的安装配置以及基本CURD操作
  6. 【学习笔记】Sass入门指南
  7. Mysql 存储引擎中InnoDB与Myisam的主要区别
  8. 后台编写HttpWebRequest的POST请求,必须注意的一个小细节
  9. 526个常用英语词组
  10. 嘿,是时候重新认识下海淘了