题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4348

题目大意:给定含有n个数的序列,有以下四种操作

1.C l r d:表示对区间[l,r]中的数加上d,并且时间加1

2.Q l r:询问当前时间区间[l,r]的和

3.H l r t:询问时间t区间[l,r]的和

4.B t :时间回到t

Sample Input

10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
2 4
0 0
C 1 1 1
C 2 2 -1
Q 1 2
H 1 2 1
Sample Output
4
55
9
15

0
1

解题思路:用线段树求区间和时可以不用把lazy标记下传,因为每次都下传的话消耗的空间会很大,很可能爆内存,我们可以直接在询问时,把当前区间的懒惰标记用一个参数传下去,然后找到要求和的区间时,直接把从上到下的懒惰标记累加和乘以区间长度再加上这段区间原本的和就可以了。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn=1e5+;
  5. struct node{
  6. int l,r;
  7. ll lazy,sum;
  8. }tree[maxn*];
  9. int n,m,t,cnt,root[maxn];
  10. void pushup(int rt,int l,int r){
  11. tree[rt].sum=tree[tree[rt].l].sum+tree[tree[rt].r].sum+tree[rt].lazy*(r-l+);
  12. }
  13. void build(int &rt,int l,int r){
  14. rt=++cnt;
  15. tree[rt].lazy=;
  16. if(l==r){
  17. scanf("%lld",&tree[rt].sum);
  18. return;
  19. }
  20. int mid=(l+r)/;
  21. build(tree[rt].l,l,mid);
  22. build(tree[rt].r,mid+,r);
  23. pushup(rt,l,r);
  24. }
  25. void update(int &now,int pre,int L,int R,int val,int l,int r){
  26. now=++cnt,tree[now]=tree[pre];
  27. if(L<=l&&R>=r){
  28. tree[now].sum+=1ll*(r-l+)*val;
  29. tree[now].lazy+=val;
  30. return;
  31. }
  32. int mid=(l+r)/;
  33. if(L<=mid) update(tree[now].l,tree[pre].l,L,R,val,l,mid);
  34. if(R>mid) update(tree[now].r,tree[pre].r,L,R,val,mid+,r);
  35. pushup(now,l,r);
  36. }
  37. ll query(int now,int L,int R,int lazy,int l,int r){
  38. if(L<=l&&R>=r){
  39. return tree[now].sum+1ll*(r-l+)*lazy;
  40. }
  41. int mid=(l+r)/; ll res=;
  42. lazy+=tree[now].lazy;
  43. if(mid>=L) res+=query(tree[now].l,L,R,lazy,l,mid);
  44. if(mid<R) res+=query(tree[now].r,L,R,lazy,mid+,r);
  45. return res;
  46. }
  47. int main(){
  48. char op[];
  49. scanf("%d%d",&n,&m);
  50. build(root[],,n);
  51. int l,r,val,T;
  52. t=;
  53. while(m--){
  54. scanf("%s",op);
  55. if(op[]=='C'){
  56. scanf("%d%d%d",&l,&r,&val);
  57. t++;
  58. update(root[t],root[t-],l,r,val,,n);
  59. }else if(op[]=='Q'){
  60. scanf("%d%d",&l,&r);
  61. printf("%lld\n",query(root[t],l,r,,,n));
  62. }else if(op[]=='H'){
  63. scanf("%d%d%d",&l,&r,&T);
  64. printf("%lld\n",query(root[T],l,r,,,n));
  65. }else if(op[]=='B'){
  66. scanf("%d",&t);
  67. }
  68. }
  69. return ;
  70. }

hdu4348 To the moon (可持久化线段树)的更多相关文章

  1. hdu4348 - To the moon 可持久化线段树 区间修改 离线处理

    法一:暴力! 让干什么就干什么,那么久需要可持久化线段树了. 但是空间好紧.怎么破? 不down标记好了! 每个点维护sum和add两个信息,sum是这段真实的和,add是这段整体加了多少,如果这段区 ...

  2. HDU 4348 To the moon 可持久化线段树,有时间戳的区间更新,区间求和

    To the moonTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...

  3. HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))

    To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  4. HDU 4348 To the moon 可持久化线段树

    To the moon Problem Description BackgroundTo The Moon is a independent game released in November 201 ...

  5. HDU 4348 To the moon(可持久化线段树)

    To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tota ...

  6. 洛谷——P3919 【模板】可持久化数组(可持久化线段树/平衡树)

    P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...

  7. [学习笔记] 可持久化线段树&主席树

    众所周知,线段树是一个非常好用也好写的数据结构, 因此,我们今天的前置技能:线段树. 然而,可持久化到底是什么东西? 别急,我们一步一步来... step 1 首先,一道简化的模型: 给定一个长度为\ ...

  8. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  9. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

随机推荐

  1. FMDB源码解析(上)-FMDB基本使用

    目录 一: 初识FMDB 二: 基本使用 三: 基本操作 结束 最后更新:2017-02-22 2017, 说到做到 一: 初识FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的 ...

  2. 移动端与PHP服务端接口通信流程设计(基础版)

    转载自:http://blog.snsgou.com/post-766.html --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的 ...

  3. 前端开发学习笔记 - 1. Node.JS安装笔记

    Node.JS安装笔记 Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an ...

  4. Vertical Center TextView . 竖直居中的UITextView

    @interface VerticalCenterTextView : UITextView @end @implementation VerticalCenterTextView - (void) ...

  5. postgresql源码编译安装(centos)

    centos6.8安装postgresql-9.6.8 一.环境 centos6.8 postgresql-9.6.8 二.准备工作 虚拟机可以连接外网 三.先安装make,gcc,gcc-c++,r ...

  6. mvn 与 pom.xml

    mvn 安装 wget http://mirrors.hust.edu.cn/apache//maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.t ...

  7. Linux内核调试方法总结之栈帧

    栈帧 栈帧和指针可以说是C语言的精髓.栈帧是一种特殊的数据结构,在C语言函数调用时,栈帧用来保存当前函数的父一级函数的栈底指针,当前函数的局部变量以及被调用函数返回后下一条汇编指令的地址.如下图所示: ...

  8. p5349 幂

    分析 https://www.cnblogs.com/cjyyb/p/10822490.html 代码 #include<bits/stdc++.h> using namespace st ...

  9. redux源码浅入浅出

    运用redux有一段时间了,包括redux-thunk和redux-saga处理异步action都有一定的涉及,现在技术栈转向阿里的dva+antd,好用得不要不要的,但是需要知己知彼要对react家 ...

  10. JS备忘--子父页面获取元素属性、显示时间,iframe之间互相调用函数

    //页面加载完成后执行 $(function () { getHW();}); //当用户改变浏览器大小改变时触发 $(window).resize(function () { setHW(); }) ...