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. 根据select的option文本选中对应的选项

    function selectByOptionTxt(obj,txt){ var optionArr = $(obj).find("option"); for(var i=0;i& ...

  2. 本地代码推送到远程git仓库

    # 1. 在远程新建一个代码仓库(如码云,github..) # 2. 将本地代码提交 git init git add * git commit -am "first init" ...

  3. PCIe事务层包TLP Header详解

    1.事务层包的一般格式: 包的header为3DW(double word)或者4DW(一个DW代表4字节),数据负载为1~1024DW(即4~4096byte,最大4M),TLP Digest可选, ...

  4. 2019 上海市大学生网络安全大赛 RE部分WP

    这次比赛就做了这一道逆向题,看到队友的WP,下面的对v10的加密方式为RC4,从我提取的v4数组就能够察觉出这是CR4了,自己傻乎乎的用OD调试,跟踪数据半天才做出来,还是见得的少了... ...下面 ...

  5. python基础知识之数据类型

    一.与用户的交互 古时候,我们去银行取钱,需要有一个银行业务员等着我们把自己的账号密码输入给他, 然后他去进行验证,成功后,我们再将取款金额输入/告诉他 骄傲的现代人,会为客户提供一台ATM机(就是一 ...

  6. Linux系统性能测试工具(七)——网络性能工具之iperf

    本文介绍关于Linux系统(适用于centos/ubuntu等)的网络性能测试工具-iperf.磁盘io性能测试工具包括: iperf: netperf 参考链接:https://www.cnblog ...

  7. 几个有关FPGA的概念

    <数字设计——原理和实践>(John F.Wakerly)的书 FPGA同步时钟设计 简单说就是 一个系统中(或系统中的一部分)都采用同一个时钟触发.系统中的(D)触发器全部都连接到一个时 ...

  8. MySQL安装+更换yum源+mysql密码忘记(2019更新)

    安装mysql步骤:1.yum install mysql-server -y2.service mysqld start3.mysql4.切换数据库 use mysql 查看表 show table ...

  9. [USACO12DEC]第一!First!(字典树,拓扑排序)

    [USACO12DEC]第一!First! 题目描述 Bessie has been playing with strings again. She found that by changing th ...

  10. New Machine Learning Server for Deep Learning in Nuke(翻译)

    最近一直在开发Orchestra Pipeline System,歇两天翻译点文章换换气.这篇文章是无意间看到的,自己从2015年就开始关注机器学习在视效领域的应用了,也曾利用碎片时间做过一些算法移植 ...