HDU 4348 SPOJ 11470 To the moon
Vjudge题面
Time limit 2000 ms
Memory limit 65536 kB
OS Windows
Source 2012 Multi-University Training Contest 5
SPOJ原版题面
Background
To The Moon is a independent game released in November 2011, it is a role-playing adventure game powered by RPG Maker.
The premise of To The Moon is based around a technology that allows us to permanently reconstruct the memory on dying man. In this problem, we'll give you a chance, to implement the logic behind the scene.
Description
You‘ve been given N integers A[1], A[2],..., A[N]. On these integers, you need to implement the following operations:
- C l r d: Adding a constant d for every {Ai | l <= i <= r}, and increase the timestamp by 1, this is the only operation that will cause the timestamp increase.
- Q l r: Querying the current sum of {Ai | l <= i <= r}.
- H l r t: Querying a history sum of {Ai | l <= i <= r} in time t.
- B t: Back to time t. And once you decide return to a past, you can never be access to a forward edition anymore.
\(N, M ≤ 10^5, |A[i]| ≤ 10^9, 1 ≤ l ≤ r ≤ N, |d| ≤ 10^4\) the system start from time 0, and the first modification is in time 1, t ≥ 0, and won't introduce you to a future state.
Input
n m
A1 A2 ... An...
(here following the m operations. )
Output
... (for each query, simply print the result. )
Example
Input 1:
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
Output 1:
4
55
9
15
Input 2:
2 4
0 0
C 1 1 1
C 2 2 -1
Q 1 2
H 1 2 1
Output 2:
0
1
吐槽
样例有点弱……传参时\(mid+1\)和\(r\)位置写反了,还过了样例,debug好久……
另外,HDU(连带着vjudge)上的样例是假的,各个case的输出之间不用换行的。换行会PE。
解题思路
题意就是写记录历史版本的线段树,也就是可持久化线段树,那就直接把区间修改的线段树板子拿过来改吧。但写着写着发现lazy标记下放会导致MLE,于是查阅资料,找到解决方案——标记永久化。lazy标记在区间加时不下放,而在区间查询时一路向下累加lazy值,当该区间被全部包含在查询区间中时,把当前区间的sum加上lazy的贡献相加,返回上去。
洛谷题解区看见另一种据说更优的方案——
[SP11470]TTM-To the moon——主席树区间修改/差分主席树里面的法二,用了两棵主席树,没太看懂,先留坑不填了。
源代码
#include <stdio.h>
int T;
int n, m;
long long a[100010];
struct Node
{
int lson, rson;
long long sum, lazy;
} t[4000010];
int cnt = 1, root[100010], timer;
void build(int &x, int l, int r)
{
x = cnt++;
t[x].lazy = 0;
if (l == r)
{
t[x].sum = a[l];
return;
}
int mid = l + r >> 1;
build(t[x].lson, l, mid);
build(t[x].rson, mid + 1, r);
t[x].sum = t[t[x].lson].sum + t[t[x].rson].sum;
}
void add(int &x, int last, int l, int r, int al, int ar, int d)
{
if (al > r || ar < l)
return;
x = cnt++;
t[x] = t[last];
if (al <= l && r <= ar)
{
t[x].lazy += d;
t[x].sum += (r - l + 1) * d;
return;
}
int mid = l + r >> 1;
add(t[x].lson, t[last].lson, l, mid, al, ar, d);
add(t[x].rson, t[last].rson, mid + 1,r, al, ar, d);
t[x].sum = t[t[x].lson].sum + t[t[x].rson].sum + t[x].lazy * (r - l + 1);
}
long long que(int x, int l, int r, int ql, int qr, long long la)
{
if (ql > r || qr < l)
return 0;
if (ql <= l && r <= qr)
return t[x].sum + la * (r - l + 1);
la += t[x].lazy;
int mid = l + r >> 1;
return que(t[x].lson, l, mid, ql, qr, la) + que(t[x].rson, mid + 1, r, ql, qr, la);
}
int main()
{
freopen("test.in", "r", stdin);
//scanf("%d", &T);
//T=1;
//while (T--)
while (~scanf("%d%d", &n, &m))
{
cnt = 1;
timer = 0;
for (int i = 1; i <= n; i++)
scanf("%lld", a + i);
build(root[0], 1, n);
char opt[2];
int l, r, t;
long long d;
while (m--)
{
scanf("%s", opt);
if (opt[0] == 'C')
{
scanf("%d%d%lld", &l, &r, &d);
add(root[timer + 1], root[timer], 1, n, l, r, d);
timer++;
}
else if (opt[0] == 'Q')
{
scanf("%d%d", &l, &r);
printf("%lld\n", que(root[timer], 1, n, l, r, 0));
}
else if (opt[0] == 'H')
{
scanf("%d%d%d", &l, &r, &t);
printf("%lld\n", que(root[t], 1, n, l, r, 0));
}
else
{
scanf("%d", &t);
timer = t;
}
}
//puts("");//hdu样例假了,这句不能要
}
return 0;
}
HDU 4348 SPOJ 11470 To the moon的更多相关文章
- 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 ...
- 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 (主席树 区间更新)
链接: 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 主席树 在线更新
http://acm.hdu.edu.cn/showproblem.php?pid=4348 以前做的主席树没有做过在线修改的题做一下(主席树这种东西正经用法难道不是在线修改吗),标记永久化比较方便. ...
- HDU 4348 To the moon 可持久化线段树
To the moon Problem Description BackgroundTo The Moon is a independent game released in November 201 ...
- HDU 4348 To the moon 可持久化线段树,有时间戳的区间更新,区间求和
To the moonTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...
- To the moon HDU - 4348 (主席树,区间修改)
Background To The Moon is a independent game released in November 2011, it is a role-playing adventu ...
- 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(可持久化线段树)
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tota ...
随机推荐
- 【MM系列】SAP MM模块-如何修改物料的移动平均价
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-如何修改物料的移动 ...
- Java程序的运行过程,以及Java为什么能够跨平台
Java程序运行机制 Java的运行主要分两步:先编译再解释执行 (1)先通过“编译器”将Java源程序(.java)编译成Java字节码文件(.class) (2)通过不同的虚拟机(JVM)将字节 ...
- ubutu16.04编译安装apache
// 安装编译器 sudo apt-get install build-essential // 下载所需依赖及apache2源码包 wget --no-check-certificate https ...
- Period II
For each prefix with length P of a given string S,if S[i]=S[i+P] for i in [0..SIZE(S)-p-1], then the ...
- linux下定时器的实现
简介: linux下经常有这样的需求,需要定时轮询执行某种任务,当然,用shell脚本的话,crontab和at就可以满足要求.如果从C语言的角度来看,实现定时器也是一个比较简单的任务,因为具有普遍性 ...
- python内存管理(通俗易懂,详细可靠)
python内存管理 python3.6.9 内存管理的官方文档 https://docs.python.org/zh-cn/3.6/c-api/memory.html 一.变量存哪了? x = 10 ...
- 2、Java调用C语言(JNative法)
这个方法也是挺麻烦的…… 一.下载JNative.jar,把它放在你jdk下的\jre\lib\ext目录下 二.在 F:\MinGW\JNative 新建 Test.java: public cla ...
- .net WebApi使用swagger 美化接口文档
本文将一步步演示如何用swagger美化WebApi接口文档,为接口文档添加接口名称说明,为请求参数和返回数据结构字段含义添加注释说明 一.为WebApi项目安装Swagger 首先我们新建一个Web ...
- [VINS]IMU与相机之间旋转量的标定
VINS-Mono[1]中IMU-Camera外参旋转量\(R_b^c\)的计算方法在他们实验室发的之前的论文有详细讲解[2].视觉利用匹配特征点中的基础矩阵求出相机坐标系下两帧的旋转量\(R_{c_ ...
- 前端开发HTML&css入门——一些其他常用的文本标签
em标签和strong标签 i标签和b标签 small标签 cite标签 q标签和blockquote标签 em主要表示语气上的强调,em在浏览器中默认使用斜体显示strong表示强调的内容,比em更 ...