GJOI noip_csp训练赛7
posted on 2025-09-26 12:17:55 | under | source
B. P12426 [BalticOI 2025] BOI acronym
Ad-hoc 恐怖如斯。下文绝对众数指出现次数严格大于其它字符。
第一个和最后一个 B 易求,于是默认序列两端都是 B。接下来我们从左到右依次确定 B,现在已知 \(1\dots i-1\) 是否是 B,判定 \(i\) 是不是 B。
绝对众数等价于去掉一个之后,仍为众数。衍生出一个想法,假如确定 \([l,r]\) 中 B 是绝对众数,那么就能判定 \(r+1\) 是否是 B,检查 \(f_{l,r}+1=f_{l,r+1}\) 即可。
于是若 \([1,i)\) 或 \([i,n]\) 中 B 都是绝对众数,就能简单判定 \(i\) 了。否则,由于 B 是 \([1,n]\) 绝对众数,因此 \([1,i),[i,n]\) 的众数分别是 O/I,那么就能判定 \(i\) 是否是 O/I 了。但有个问题,O/I 的出现次数可能和 B 一样,你把开头和结尾的 B 扔掉就行了。
总结:这种题就不可能稳定切掉,就尽量多试不同做法看能不能蒙中一个,最好把能想到的都写在纸上。
C. P12558 [UOI 2024] Heroes and Monsters
考虑 \(S\) 是否合法。把人和怪兽扔到数轴上,相当于 \(S\) 中的人要向左匹配、反之向右匹配。如果已经确定与 \(S\) 匹配的怪兽集合则为括号匹配问题,因此考虑如何对怪兽分组。显然贪心让 \(S\) 的匹配最左边,其它匹配最右边。
枚举分界线,即 \(|S|=k\),那么就能用 dp 处理。直接做状态过多,但你注意到左半和右半的关联并不大,事实上对于 \(S\) 只用关心它们在前 \(k\) 个位置的匹配情况,反之同理。于是左右分别 dp 再拼起来即可 \(O(n^2)\)。
总结:dp 时若两维关联性并不大,就要考虑能否分离。
D. QOJ971. Binary Search Tree
考虑序列扫描线,依次处理每棵树。现在已知有哪些操作,考虑求 \(t\) 时刻插入 \(w\) 答案是多少。
一个重要的性质是可以对 \(<w\) 和 \(\ge w\) 分开处理再加起来。感性理解一下,比方说现在关心 \(\ge w\) 的权值,那么将 \(<w\) 的直接缩掉没有影响。
以 \(\ge w\) 的为例,那么 \(w\) 就会被插入到树上最左边的位置。考虑 \(w\) 的父亲节点是谁,显然是比它早的最小值。那么重复这个过程即可统计祖先链。
按权值排序后,相当于一直向右找比它早的,使用单侧递归线段树即可。

浙公网安备 33010602011771号