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 ...
随机推荐
- 基于JAVA的设计模式之代理模式
概念 王宝强有一个经纪人叫宋喆,这个经纪人很吊,可以代理王宝强做一系列的事情,与粉丝活动.王宝强的微博维护.安排王宝强的行程以及什么什么等等.如果王宝强一个人做岂不是累死.通过这个代理人为王宝强节省了 ...
- Hi,bro
这是我第一次写部落格,也是我刚开始学python,希望我以后能把To Do List 做好,也希望大家可以好好学习,为了以后good life去努力,Do SomeThing OK?
- ArrayList 练习题
1点名器 import java.util.ArrayList; import java.util.Random; import java.util.Scanner; class CallName3 ...
- SQL概念及DDL语句
SQL概念 SQL全称(Structured Query Language):结构化查询语句,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询和管理关系型数据库. 其实就 ...
- ApexSQL Log中的Redo Script跟原始SQL不一致问题
最近遇到一个误更新数据的问题,使用ApexSQL Log做挖掘事务日志的时候,发现ApexSQL Log生成的Redo Script跟原始SQL是有区别的.它们并不是完全一致的.只是逻辑上等价而已.如 ...
- 一键部署joomla开源内容管理平台
https://market.azure.cn/Vhd/Show?vhdId=10896&version=12949 产品详情 产品介绍Joomla是一套自由.开放源代码的内容管理系统,以PH ...
- Struts功能详解 ——ActionServlet
ActionServlet类是Struts框架的内置核心控制器组件,它继承了javax.servlet.http.HttpServlet类.Struts的启动通常从 加载ActionServlet开始 ...
- Windows系统下查看文件编码类型
这是一个程序员的最基本的技能,原谅我到现在才去了解 以前只知道window操作系统下文件大部分默认编码是ANSI,中文版是GBK编码 如果想要查看或者修改文件编码的话有两种方式 一:用记事本打开文件, ...
- Java 方法重载与引用数组类型
1.方法重载 1)方法的签名 方法的签名包含方法名和参数列表 一个类中,不可以有两个方法的签名完全相同,即一个类中不能有两个方法的方法名和参数列表都一样. public class Test{ pu ...
- COGS 2342. [SCOI2007]kshort
★★☆ 输入文件:bzoj_1073.in 输出文件:bzoj_1073.out 简单对比时间限制:2 s 内存限制:512 MB [题目描述] 有n个城市和m条单向道路,城市编号为1 ...