? #3
被同机房刚学了半年多的大神吊打了,是不是该退役了 /ll,哦对本来就是()
还是 ds 专场。
OIFHA联合训练第九场
时间:4h (2025.10.13 07:40~11:40)
题目数:4
难度:
| A | B | C | D |
|---|---|---|---|
| \(\color{#F39C11} 橙\) | \(\color{#52C41A} 绿\) | \(\color{#3498DB} 蓝\) | \(\color{#BFBFBF} ?\) |
| *1200 | *1700 | *2300 | *? |
估分:100 + 20 + 30 + 0 = 150
得分:100 + 40 + 30 + 0 = 170
Rank:2/10+
场祭
A 签。
读题。
欸 D 是莫队吗?哦区间的移动是困难的。浪费了点时间。
开 B,想二分但是发现复杂度是恐怖的 \(O(qn \log n)\),然后想到预处理枚举每个 \(v_i\) 作为中位数,然后还是二分,但是发现动态前 \(k\) 大和不会,于是打暴力走人。
C 先有一个暴力 dp,然后是用个什么东西去优化,应该是与上一个相等的位置有关,但是不知道有什么关系,线段树也看起来没道理的样子,打暴力。
忽然发现会 B 了,抱抱我真糖动态前 \(k\) 大和那不直接 01trie 上二分就解决了吗?写写写,发现被卡空间了,没事开小一点也有 80pts,然后调调调,调了 712 年过小样例了,但是大样例与答案相差一个很小的数,然后就没时间了。
补题
被同机房刚学了半年的大神吊打了(他 180pts),是不是该退役了 /ll,哦对本来就是()
哦我 B 01trie 写挂了,忘了统计到了叶子节点时 \(k \ne 0\) 的情况了,改了就 80pts 了。
然后发现我是奶龙,直接把 01trie 换成线段树就不被卡空间了。
正解怎么 1log?2log 连 2e8 都不到,那过 2s 不很轻松啊()实测没卡常只跑了 770ms。。
补 C,妙妙题!考虑合法的转移满足什么条件,若 \(f_{j-1} \to f_i\) 是可以转移的,那么 \([j,i]\) 内出现次数为 \(1\) 的数的个数必须 \(\le p\)。
令 \([j,i]\) 内出现次数为 \(1\) 的数的个数为 \(c_j\),然后看看这个东西是否可以从 \(i-1\) 继承过来,发现是可以的!因为只多出来一个 \(a_i\) 不会带来太大的改变,容易推出 \([pre_i+1,i]\) 内的 \(c\) 会 \(+1\),\([pre_{pre_i}+1,pre_i]\) 内的 \(c\) 会 \(-1\)。
于是我们需要维护一个数据结构,支持 \(c_j\) 的区间 \(\pm 1\) 操作,以及统计 \(j \in [1,i]\) 内所有满足 \(c_j \le p\) 的 \(f_{j-1}\) 之和。发现线段树是维护不了的,但是分块很容易,开个 \(O(n \sqrt n)\) 的数组 \(s_{i,j}\) 表示第 \(i\) 块 \(c_x = j\) 对应的 \(f_{x-1}\) 之和,就可以支持上面两个操作了。
补 D,正解要可持久化线段树,故只补 \(l=1\) 的特殊性质。
因为题目中的东西是不好直接维护的,所以考虑能否转化一下变成好维护的东西。容易发现 \([l,r]\) 合法的充要条件就是 \(\max _{i=l} ^r \{a_i\} - \min_{i=l} ^r \{a_i\} = r-l\),这启发我们维护一个 \(val = (\max - \min) - (r-l)\) 状物。
然后考虑 \(r \gets r+1\) 的时候,会产生多少个以 \(r+1\) 为右端点的合法区间。考虑动态地维护所有以 \(r\) 为右端点的区间的 \(val\),发现在 \(r \gets r+1\) 后,\(val\) 产生的变化时确定的:
- \(l\) 不会改变。
- 所有区间的 \(val\) 中的 \(r\) 都会增加 \(1\),于是 \(val\) 便都减去 \(1\)。
- \(\max , \min\) 是等难的,故只考虑 \(\max\)。维护一个单调栈,则单调栈弹出的点的 \(\max\) 会被更新为 \(a_i\)。不过每个点的变化量是不一样的,具体地,对于 \(a_{stk_j} < a_i\),区间 \([stk_{j-1}+1 , stk_j]\) 原本的 \(\max\) 都是 \(a_{stk_j}\),所以变化量均为 \(+ (a_i - a_{stk_j})\)。
发现可以线段树去维护这个过程,维护所有 \(val\)。因为上面的东西都是区间加可以做的。
看看答案怎么算,发现直接统计是困难的,因为区间加之后 \(val = 0\) 的个数就改变了,然后发现换成分块就秒了,和上一题维护类似的东西就可以了。
但是线段树真的不可以做吗?可以的!继续观察式子,发现 \(\max - \min \ge r-l\) 是恒成立的,然后注意到区间最小值以及最小值的个数是可以维护的,然后……就没了,只需要判断询问的区间内最小值是否为 \(0\) 就可以统计答案了。
调了 1h 发现线段树 merge 的时候直接 res=l 了但是没有清空 tag!我好糖呜呜/dk
天依宝宝可爱!

浙公网安备 33010602011771号