0%

2026 杭电春季联赛 4——1007-喂马(ODT 配合)

题目大意

给定多组数据。每组有 n 匹马按编号 1..n 排列,m 个饲料槽编号 1..m

初始时第 i 匹马分配到槽 a_i,其中 a_i=0 表示未分配。每个槽的投喂总量 b_i 初始都是 0

需要按顺序执行 q 次操作,每次输入 opt, l, r, x

  • opt=1:把区间 [l,r] 内所有马的分配槽改为 x

  • opt=2:对区间 [l,r] 内每匹马,如果它当前已分配槽(a_i≠0),就给它所在槽增加 x 的投喂量(累加到对应 b_{a_i})。

所有操作结束后,输出 m 个数,表示每个槽最终投喂总量 b_1..b_m

1
2
3
4
5
6
7
8
9
10
11
12
Sample Input
1
6 4 5
1 0 3 2 4 1
2 1 4 3
1 2 5 1
2 1 6 2
1 3 4 4
2 2 5 4

Sample Output
23 3 3 8

样例过程对应含义:

  • 初始分配:[1,0,3,2,4,1],所有 b_i=0

  • 操作 2 1 4 3:马 1..4 中已分配的有 1,3,4 号马,分别给槽 1,3,2 各加 3

  • 操作 1 2 5 1:马 2..5 全部分配到槽 1

  • 操作 2 1 6 2:马 1..6 都已分配,按当前分配给对应槽加 2

  • 操作 1 3 4 4:马 3..4 改分配到槽 4

  • 操作 2 2 5 4:马 2..5 都已分配,按当前分配给对应槽加 4

最终各槽投喂总量为:23 3 3 8

思路讲解

2025 河南省赛——Problem C. Toxel 与宝可梦图鉴(珂朵莉树+值域线段树维护全局信息)(因为这道题目,可以设计珂朵莉树无这个查询操作,只有 assign 操作,因此严格 O(nlogn))(区间等差数列赋值,全局查询最小众数)

PDF

PDF

这个下面的这个避免树状数组清空的技巧还是非常有用的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
	void assign(ll la, ll ra, ll val) {
split(la);
split(ra + 1);
auto it = mpODT.lower_bound(la);
#ifdef LOCAL
assert(it->first==la);
#endif
for (; it != mpODT.end();) {
if (it->first > ra) {
break;
}
ll originV = it->second.val;
ll l = it->first, r = it->second.r;
// 这里是做一些事情,比如说累加答案
ll add = tr->query(l, r);
anss[originV] += add;
anss[val] -= add;
it = mpODT.erase(it);
}
mpODT[la] = {ra, val};
}

image

AC代码

AC

https://acm.hdu.edu.cn/contest/view-code?cid=1201&rid=9803

心路历程(WA,TLE,MLE……)