CSP2019 题解
快要 csp2020 了,来补 2019 的题(咕
D1T1
手玩就出来了?
D1T2
容易想到统计每个节点为右端点的子串数,然后继承给子节点就好了。然后记录每个节点祖先中离它最近的未匹配的 ‘(‘ 是哪个,再记录一下每个节点为右端点的合法的 ‘(…)’ 数,就好了!
条条大路通罗马,有时候错误的思路也会导出正确的思路。要有信仰!!!
1 |
|
D1T3
部分分推出正解。
菊花:将数字按照 $(rt, p_1, p_2, … p_{n - 1})$ 排出来,发现相当于每个位置上的数往后移了一位。贪心的构造轮换。
链:对于在 $u$ 位置的要移到 $v$ 位置(假设 $u < v$),显然 $[u, v]$ 之间的删边顺序是从左到右,$u$ 右边比 $u$ 左边删的早。打标记,$i$ 点 $tag_i = 0, 1, 2$ 表示无标记,先左后右,先右后左
这是很有启发性的两档分!接下来考虑满分做法,显然就是 $u$ 指向 $v$ 的出边是第一个删的,$v$ 指向 $u$ 的出边是第一个删的,$[u, v]$ 之间的点都还没被删。
抽象一点就是把图分成很多不相交的链了。
复杂度 $O(n^2)$
1 |
|
D2T1
(啊。。这个题目真的恶心。。差点没懂)
考虑每种食材都不超过 $\lfloor \frac{k}{2} \rfloor$ 这个限制很烦,考虑容斥,统计每种食材打破限制的总方案数然后减掉就好了。
对于第 $col$ 种食材打破限制,设 $f[i, j]$ 表示前 $i$ 个烹饪方法中选的第 $col$ 种食材的菜与不是第 $col$ 种食材的菜的个数差为 $j$ 的方案数。
1 |
|
D2T2
考场上写了 $n^3$ 暴力后突然聪明了一下,输出了一些东西,发现这玩意是单调的然后就多了 32 分 qvq 论信仰的力量。。
88 分就是再加个单调队列!100 分再加个高精度。。。
具体来说,$j$ 能转移到 i 当且仅当 $pre[i] - pre[j] >= len[j]$,$len[j]$ 表示以 $j$ 为结束的段,$pre[i] >= pre[j] + len[j]$。发现 $j$ 越大越好(这就是我考场上发现的单调性),单调队列一波就可以了。
1 | // 88 分代码 |
D2T3
学习了 xht37 的思路(是我比较适应的方法):算出每一个节点为重心的次数。
选一个重心为根,对于我们考虑的 $x (x\neq rt)$,割的边一定不在 x 的子树里。设 $mx[x] = \max\{size[y]\}$, $S$ = 割掉边后不包含 $x$ 的那块的 $size$,那么有:$2(n - S - size[x]) \leq n - S$, $2mx[x] \leq n - S$,也就是要求 $n - 2size[x] \leq S \leq n - 2mx[x]$ 且边不在 $x$ 子树中的边数
那个不等式用树状数组维护一下,就成了区间求和;第二个约束可以在进出某个子树的时候作差。
$x = rt$ 时怎么办?设 $size$ 最大的子树是 $u$ 的,次大的是 $v$ 的。割边在 $u$ 子树中时 $2size[u] \leq n - S$, 在 $v$ 子树中时 $2size[v] \leq n - S$
1 |
|