#HK4798. 「RMI 2021」Weirdtree

「RMI 2021」Weirdtree

注意事项

在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

  • C++(标准为 C++ 17 及以上)

请在提交源代码前添加 #include "weirdtree.h"

题目描述

题目译自 Romanian Master of Informatics 2021 Day2 T3 「Weirdtree

高地女巫阿兹莎发现了一个充满古怪树木的花园!因此,她和她的朋友莱卡决定在那里度过一些时间照顾花园。

花园可以看作是一系列 NN 棵树,其中树木的编号为 11NN 。每棵树都有一个特定的非负整数高度。然后,阿兹莎将根据一个包含 QQ 个条目的日程表来度过她的时间,这些条目可以是几种类型:

  1. 树木切割阶段,由三个整数 l,r,kl, r, k 表示。在这个阶段,阿兹莎将在接下来的 kk 天内切割树木。每天她都会找到编号在 llrr 之间最高的树,并将其高度减少 11。如果有多棵树具有这种最大高度,她会选择最左边的树。如果最高的树的高度为 00,则当天不会发生任何事情。
  2. 魔法阶段,由两个整数 iixx 表示。在这个阶段,阿兹莎会改变编号为 ii 的树的高度为 xx
  3. 树木询问阶段,由两个整数 llrr 表示。在这个阶段,阿兹莎将找到编号在 llrr 之间(包含 llrr)的树的高度之和。

阿兹莎好奇树木询问阶段的结果是什么,并希望在不经历整个日程表的情况下知道它们。你能帮她吗?

实现细节

你必须实现以下四个函数:

void initialise(int N, int Q, int h[]);
void cut(int l, int r, int k);
void magic(int i, int x);
long long int inspect(int l, int r);

initialise 函数给定 NN(树的数量)、QQ(日程表中的条目数)和一个数组 hh,其中 h[i]h[i] 是树 i (1iN)i\ (1\leq i\leq N) 的高度。这个函数在会调用其他三个函数之前调用一次。cutmagicinspect 函数分别代表树切割、魔法和树询问阶段,并由它们各自的参数表示。你的 inspect 函数实现必须返回编号在 llrr 之间的树的高度之和。

你不应实现 main 函数。您将在「文件」中获得一个交互器示例 grader.cpp。我们的 main 函数将读取 N,QN, QNN 个初始高度的序列和 QQ 个日程表条目。三种类型的日程表条目(cut(l, r, k)magic(i, x)inspect(l, r))的格式分别为 1 l r k2 i x3 l r。这也是样例中使用的输入格式。

6 10
1 2 3 1 2 3
1 1 6 3
3 1 6
1 1 3 3
3 1 6
1 1 3 1000
3 1 6
2 1 1000
3 1 6
1 1 3 999
3 1 5
9
6
5
1005
4

在第一阶段,经过 33 天的树木切割后,树木的高度为 1,2,2,1,2,31,2,2,1,2,31,2,2,1,2,21,2,2,1,2,2;和 1,1,2,1,2,21,1,2,1,2,2。这些值的总和是 99,这是第二阶段询问的答案。

在第三阶段,经过 33 天的树木切割后,树木的高度为 1,1,1,1,2,21,1,1,1,2,20,1,1,1,2,20,1,1,1,2,2;和 0,0,1,1,2,20,0,1,1,2,2。这些值的总和是 66,这是第四阶段询问的答案。

在第五阶段,经过 10001000 天的树木切割后,树木的高度为 0,0,0,1,2,20,0,0,1,2,2。这是因为高度为 00 的树无法被切割。这些值的总和是 55,这是第六阶段询问的答案。

在第七阶段,第一棵树的高度变为 10001000,树木的高度为 1000,0,0,1,2,21000,0,0,1,2,2。这些值的总和是 10051005,这是第八阶段询问的答案。

在第九阶段,每一天的树木切割都会将第一棵树的高度减少 11。这在我们阶段结束时给了我们树高 1,0,0,1,2,21,0,0,1,2,2。前五个值的总和是 44,这是第十个也是最后一个阶段询问的答案。

数据范围与提示

对于所有输入数据,满足:

  • 1N,Q31051 \leq N, Q \leq 3\cdot 10^5
  • 保证 cutmagicinspect 函数总共将被调用 QQ 次。
  • 1iN1 \leq i \leq N
  • 0x,k,h[i]1090 \leq x, k, h[i] \leq 10^9
  • 1lrN1 \leq l \leq r \leq N

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
11 55 N1000,Q1000,k=1N \leq 1000, Q \leq 1000, k=1
22 88 N8104,Q8104,k=1N \leq 8\cdot 10^4, Q \leq 8\cdot 10^4, k=1
33 88 N1000,Q1000N \leq 1000, Q \leq 1000,没有魔法操作
44 1919 没有魔法操作
55 1010 l=1,r=Nl=1, r=N
66 2121 N8104,Q8104N \leq 8\cdot 10^4, Q \leq 8\cdot 10^4
77 2929 无附加限制