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的更多相关文章

  1. 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 ...

  2. hdu 4348 To the moon (主席树)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4348 题意: 一个长度为n的数组,4种操作 : (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 . (2)Q ...

  3. 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    询问当前时 ...

  4. HDU 4348 To the moon 主席树 在线更新

    http://acm.hdu.edu.cn/showproblem.php?pid=4348 以前做的主席树没有做过在线修改的题做一下(主席树这种东西正经用法难道不是在线修改吗),标记永久化比较方便. ...

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

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

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

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

  7. To the moon HDU - 4348 (主席树,区间修改)

    Background To The Moon is a independent game released in November 2011, it is a role-playing adventu ...

  8. hdu 4348 To the moon 主席树区间更新

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

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

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

随机推荐

  1. LeetCode算法题-Magic Squares In Grid(Java实现)

    这是悦乐书的第326次更新,第349篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第196题(顺位题号是840).3 x 3魔方是一个3 x 3网格,填充了从1到9的不同 ...

  2. 【Qt开发】【Linux开发】QT设置环境变量QWS_DISPLAY

    QT设置环境变量QWS_DISPLAY 当应用程序./myQtApp -qws启动时,会去检测QWS_DISPLAY这个环境变量, 判断界面最终显示在哪个framebuffer中, 如果是虚拟的fra ...

  3. oracle跟SQL Server 2005 的区别

    Oracle与Sql server的区别   一直搞不明白Oracle数据库和sql server的区别,今天我特意查资料把他们的区别整理出来 Oracle数据库:Oracle Database,又名 ...

  4. C++中对象的构造顺序

    1,C++ 中的类可以定义多个对象,那么对象构造顺序是怎样的? 1,很多的 bug 是由对象的构造顺序造成的,虽然它不难: 2,对象的构造往往和构造函数牵涉在一起,构造函数的函数体又可能由非常复杂的程 ...

  5. Java8与JDK8和JDK1.8有什么区别?

    JDK版本与发行时间 版本 名称 发行日期 JDK 1.0 Oak(橡树) 1996-01-23 JDK 1.1 none(无) 1997-02-19 JDK 1.1.4 Sparkler(宝石) 1 ...

  6. go & Windows Service

    相关库 https://godoc.org/golang.org/x/sys/windows/svc https://github.com/kardianos/service https://gith ...

  7. 解决PKIX path building failed的问题

    Java在请求某些不受信任的https网站时会报:PKIX path building failed 解决方法一:使用keytool手动导入证书,为JRE环境导入信任证书 参考:http://www. ...

  8. Spark-Streaming获取kafka数据的两种方式:Receiver与Direct的方式

    简单理解为:Receiver方式是通过zookeeper来连接kafka队列,Direct方式是直接连接到kafka的节点上获取数据 Receiver 使用Kafka的高层次Consumer API来 ...

  9. 利用 TCMalloc 优化 Nginx 的性能

    TCMalloc 全称为 Thread-Caching Malloc,是谷歌的开源工具 google-perftools 的成员,它可以 在内存分配效率和速度上高很多,可以很大程度提高服务器在高并发情 ...

  10. 分分钟轻松搞定IBM系列 RAID5搭建

    分分钟轻松搞定IBM系列 RAID5搭建 按照 以下图片步骤一步步可轻松完成IBM服务器RAID1.5.10等的搭建. 此例是以RAID5为例,RAID1和10可举一反三.