初一周六练习题
P3870 [TJOI2009] 开关
经典问题:区间异或,区间数 \(1\)。
考虑在线段树上给出一个翻转标记 \(tag\),表示目前要不要翻转 \(0/1\),每次 pushdown 时就将标记翻转,因为操作两次等于没有操作,顺便维护一个 \(1\) 的个数即可。
P8818 [CSP-S 2022] 策略游戏
怎么是我初一那年 CSP。
首先遇到了一个博弈的思想,其实本题目标是让小 \(L\) 选择一个数,随后无论小 \(Q\) 怎么选(小 \(Q\) 会尽量选使答案小的),都可以使得在所有情况中最优。
比较常规的思路是 \(a \times b\) 就肯定是两个最值乘在一起,否则一定将两个人其中一个调整为最值更优。
但是由于有正负之分,你可以分别维护 \(A\) 和 \(B\) 的正/负数的最小/最大值,最后利用上述博弈的思路检验一下答案即可。
P10463 Interval GCD
首先考虑单点更改怎么做。
很简单的,因为是单点更改,允许我直接改到叶子结点,又由于 \(\gcd\) 操作有结合律,所以可以直接用线段树维护。
那么区间修改你想一下,无法直接有效的加一个数,我们不妨思考如何用树状数组维护区间加,区间求和。那么就要使用差分,利用辗转相除(其实是更相减损),可以得到差分完之后的数组求 \(\gcd\) 等价于原数组求 \(\gcd\),又由于是差分数组是单点更改,于是便将问题转化至上述问题。
CF2143D2 Inversion Graph Coloring (Hard Version)
考虑问题的逆命题,那么很清晰的就能知道本质上一个子序列合法当前仅当它能够被划分成两个不下降子序列。
根据 Dilworth 定理,划分成不超过两个这样的子序列等价于最长下降子序列长度不超过 \(2\)。
比较显然的 DP 是记录下来最长下降子序列第一个元素最大是多少和第二个元素最大是多少,这样是 \(O(n^3)\) 的。
形式写出来形如单点加区间求和,用个树状数组即可通过。
P3899 [湖南集训] 更为厉害
这个题原本的题面因为含有政治影射被办掉了。
有很多方法,我来一个最简单的。
首先发现 \(a, b\) 都为 \(c\) 的祖先,且距离不超过给定常数 \(k\),尝试分类讨论:
- \(b\) 为 \(a\) 祖先,\(c\) 的限制是关于 \(a\) 的,那么就是在 \(a\) 的子树里任选。
- \(a\) 为 \(b\) 的祖先,答案就是 \(a\) 以下距离不超过 \(k\) 的邻域中所有点的子树大小和。
显然不好直接做的是第二个邻域求和。
子树邻域问题常见转化是限制交,因为此时这些点既满足在某一 DFS 序区间内又满足深度在某一区间内,离线下来二维数点即可。
P2014 [CTSC1997] 选课
题意即选择整张森林中包含根结点的连通块集合,使得这些连通块内点权和最大。
首先建虚点将森林建成树,好处理一些也省去合并答案的一步。
设 \(f_{i, j}\) 为 \(i\) 结点的子树选了 \(j\) 个的最大权值,树形背包合并一下即可。

浙公网安备 33010602011771号