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 ...
随机推荐
- P3290 寻找第K大数
描述 寻找第K大数 N个小朋友在一起做游戏.每个小朋友在自己的硬纸板上写一个数,然后同时举起来.接着,小y老师提一个问题,看哪个小朋友先抢答出来.问题是:在这N个数中,第K大的是哪个数?请你编程完成. ...
- fleet - 基于Machine Metadata的任务调度
基于Machine Metadata的任务调度 复杂和特定的要求的应用程序可以针对一个子集的集群调度通过machine metadata.强大的部署拓扑结构,可以实现的基础上的机器的地区,机架位置,磁 ...
- 13.JAVA-包package、import使用
1.包的定义 之前我们学习java时,生成的class文件都是位于当前目录中,假如出现了同名文件,则会出现文件覆盖问题,因此就需要设置不同的目录(定义包),来解决同名文件冲突问题. 并且在大型项目中, ...
- php分页代码及总结
代码部分: <?PHPheader("Content-type:text/html;charset=utf-8");$pageSize = 10;//接收传入的分页码$pag ...
- Redis、Memcache区别
Redis.Memcache区别 redis单核 memcahce多核 redis支持数据持久化 redis支持的数据类型比较多 memcache 只有key->value类型 key-> ...
- Ubuntu获取root 权限,开机自动登入root
新机器获取root权限,只需要给root 增加密码: sudo passwd root 修改开机自动登入: #sudo gedit /etc/lightdm/lightdm.conf 修改参数: au ...
- Jquery ajax中表单提交被拦截的问题处理方法
在实际开发项目中,由于要做支付宝的批量退款处理,需要用到ajax中去提交表单数据,项目截图如下: 由于在第二张截图“确认退款”那里需要异步ajax提交数据到服务器处理信息,处理成功后将返回的数据装载到 ...
- HDU 3001 Travelling (状压DP,3进制)
题意: 给出n<=10个点,有m条边的无向图.问:可以从任意点出发,至多经过同一个点2次,遍历所有点的最小费用? 思路: 本题就是要卡你的内存,由于至多可经过同一个点2次,所以只能用3进制来表示 ...
- 洛谷 P2014 选课
题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...
- Spark 配置整理
Spark 的配置有很多,这里一方面总结一下官方文档中的内容,一方面将网上查到的资料中用到的针对特定问题的配置整理一下. 先看一下官网的配置:http://spark.apache.org/docs/ ...