HDU 4348 To the moon 主席树
题意:
给出一个长度为\(n(n \leq 10^5)\)的序列,最开始时间\(t=0\),支持下面几个操作:
- \(C \, l \, r \, d\):将区间\([l,r]\)每个数都加上\(d\),并且时间\(t\)增加1秒
- \(Q \, l \, r\):查询当前时间区间\([l,r]\)所有元素之和
- \(H \, l \, r \, t\):查询时间为\(t\)时,区间\([l,r]\)的所有元素之和
- \(B \, t\):时间回溯到\(t\)
输出每次查询的结果。
分析:
这是支持区间修改的可持久化线段树。
我们维护一个\(sum\)表示区间的元素和以及一个懒惰标记\(add\)。
由于是主席树,查询时如果要\(pushdown\)就会新增节点,空间开销比较大。
所以查询时不进行\(pushdown\),而是累加所经过的节点的\(add\)值 乘上 查询区间长度。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 100000 + 10;
struct Node
{
int lch, rch, add;
LL sum;
};
int sz;
Node T[maxn << 5];
int n, m, root[maxn];
LL S[maxn];
char op[5];
int update(int pre, int L, int R, int qL, int qR, int v) {
int rt = ++sz;
T[rt] = T[pre];
T[rt].sum += (LL)v * (min(R, qR) - max(L, qL) + 1);
if(qL <= L && R <= qR) { T[rt].add += v; return rt; }
int M = (L + R) / 2;
if(qL <= M) T[rt].lch = update(T[pre].lch, L, M, qL, qR, v);
if(qR > M) T[rt].rch = update(T[pre].rch, M+1, R, qL, qR, v);
return rt;
}
LL query(int rt, int L, int R, int qL, int qR) {
if(qL <= L && R <= qR) return T[rt].sum;
LL ans = (LL)T[rt].add * (min(R, qR) - max(L, qL) + 1);
int M = (L + R) / 2;
if(qL <= M) ans += query(T[rt].lch, L, M, qL, qR);
if(qR > M) ans += query(T[rt].rch, M+1, R, qL, qR);
return ans;
}
int main()
{
bool flag = false;
while(scanf("%d%d", &n, &m) == 2) {
if(flag) puts(""); flag = true;
for(int i = 1; i <= n; i++) {
scanf("%lld", S + i);
S[i] += S[i - 1];
}
sz = 0;
int time = 0;
while(m--) {
scanf("%s", op);
int l, r, d; scanf("%d", &l);
if(op[0] == 'C') {
scanf("%d%d", &r, &d);
time++;
root[time] = update(root[time - 1], 1, n, l, r, d);
} else if(op[0] == 'Q') {
scanf("%d", &r);
LL ans = S[r] - S[l - 1];
ans += query(root[time], 1, n, l, r);
printf("%lld\n", ans);
} else if(op[0] == 'H') {
scanf("%d%d", &r, &d);
LL ans = S[r] - S[l - 1];
ans += query(root[d], 1, n, l, r);
printf("%lld\n", ans);
} else {
time = l;
}
}
}
return 0;
}
HDU 4348 To the moon 主席树的更多相关文章
- HDU 4348 To the moon 主席树 在线更新
http://acm.hdu.edu.cn/showproblem.php?pid=4348 以前做的主席树没有做过在线修改的题做一下(主席树这种东西正经用法难道不是在线修改吗),标记永久化比较方便. ...
- hdu 4348 To the moon (主席树)
版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4348 题意: 一个长度为n的数组,4种操作 : (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 . (2)Q ...
- hdu 4348 To the moon (主席树区间更新)
传送门 题意: 一个长度为n的数组,4种操作 : (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 . (2)Q l r:查询当前时间戳区间[l,r]中所有数的和 . (3)H ...
- hdu 4348 To the moon 主席树区间更新
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Prob ...
- hdu 4348 To the moon (主席树 区间更新)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4348 题意: 4种操作: C l r c 区间[l,r]加c,时间+1 Q l r 询问当前时 ...
- HDU 4348 To the moon(主席树 区间更新)题解
题意: 给一个数组A[1] ~ A[n],有4种操作: Q l r询问l r区间和 C l r v给l r区间每个数加v H l r t询问第t步操作的时候l r区间和 B t返回到第t步操作 思路: ...
- HDU 4348 To the moon(主席树区间修改)
题意 给你一个区间,支持如下操作: 在一段区间内加上一个值,并生成一个历史版本 查询某个版本下一段区间内的和 回到一个历史版本上并舍弃之后的版本 做法 这就是主席树区间修改裸题啦QwQ 上一篇博客我讲 ...
- HDU 4348 To the moon (主席树区间更新)
题意:首先给你n个数,开始时间为0,最后按照操作输出 给你四种操作: 1. C l r d : 在(l,r)区间都加上d,时间加一2. Q l r : 询问现在(l,r)的区间和3. H l r ...
- 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 ...
随机推荐
- Jquery each跳出循环
Jquery each跳出循环break--return false--跳出所有循环continue--return true--跳出当前循环
- Java_面向对象的 static 和 abstract
static:表示静态的 static:可以用来修饰属性.方法.代码块(或初始化块).内部类. 一.static修饰属性(类变量): public class TestStatic { //stati ...
- Java获取服务器系统默认编码格式
大佬教的,做个笔记方法一(推荐):新建一个jsp页面在webapp下然后添加 <% out.print(System.getProperties().getProperty("file ...
- 判断字符串string是数字、json结构、xml结构
import org.json.JSONException; import org.json.JSONObject; import org.dom4j.DocumentException; impor ...
- 用Meta标签代码让360双核浏览器默认极速模式打开网站不是兼容模式
公司所作的页面在360下打开都会遇到在360下自动跳到360兼容模式引发许多兼容问题,摸索了好久终于在网上找到了怎么解决的方法,详情如下: 其实360给网站开发者设计了一种选择的方法,只要加入一段Me ...
- css中伪类/伪元素详解
一.伪类和伪元素 伪类和伪元素都是用来修饰不在文档树中的部分,区别在于, 伪类用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的(如:hover/:active). ...
- js屏蔽鼠标右键事件
<script type="text/javascript">function stops(){ return false;}document.oncontextmen ...
- iOS-浅谈runtime运行时机制02-runtime简单使用
http://blog.csdn.net/jiajiayouba/article/details/44201079 由于OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方 ...
- Hadoop 2.7.0模拟分布式实验环境搭建[亲测]
实验目的: 本实验通过在PC电脑上同时运行3个虚拟机,一个为master节点,两个slave节点. 搭建环境: 主机:mac os 10.10 OS:CenOS 6.5 虚拟机:VMware ...
- GWT module 'xxx' may need to be (re)compiled解决办法
使用GWT Eclipse Plug-in开发GWT应用,启动程序,在浏览器地址栏中输入http://127.0.0.1:8888/HelloWorld.html,没有出现我所期望的结果,而是弹出如下 ...