[整理]新年的杂题

P4426 [HN/AH18]

为什么会让求一个 NPC 呢?一看数据范围才明白是一棵树加上很少的边。
一个简单的思路是暴力枚举非树边的状态,可以获得至少七十分的好成绩。
但是我们发现很多状态没必要重新 dp 一遍,所以搬上虚树,提前计算出下面状态对上面状态的贡献系数。算贡献系数看起来麻烦,其实就是从虚树的儿子到父亲模拟一遍 dp,需要注意各种下标的意义和区分。
复杂度是美丽的 \(O(n+k2^k)\),其中 \(k=m-n+1\)。这个题其实非常板,有经验的选手很快就能知道大概的解法,但实现有一大堆细节需要注意。

P3226 [HN12]

MO 板子题,只需要转化成一个每行公比 \(2\) 每列公比 \(3\) 的矩阵选不相邻数字的方案数。容易发现每个不被 \(2\)\(3\) 整除的数都能扩展出一个矩阵,而每个矩阵的大小是 \(\log\) 级的,因此可以状压 dp。
复杂度非常玄学,我并不能严格计算出来,但是它看起来非常能过,实现时注意矩阵的方向以减小常数。

P3974 [TJ15]

是一个 Dilworth 定理的版题。其实说是定理倒不如说是一个显然的 trick,把原题转化成最多的不能互相到达的点集,那就是从右上走到左下选最多的点。

ARC068D

一道神题,但是出题人被加了三个零。考虑这个操作会形成什么序列:所有入队操作会形成一个单谷序列,所有出队操作会形成一个恰能分成两个递减子序列的序列,也就是不存在长度超过 \(2\) 的上升子序列(Dilworth 定理)。
把原来的排列 \(p\) 转化为满足 \(q_{p_i}=i\) 的反排列,容易证明上面的性质仍然存在,并且要求的答案变成了更简单的 \(q_1=k\)
这个东西长得一脸 dp,我们设 \(f_{i,j}\) 表示 \(i\) 个数满足条件的排列 \(q_1=j\) 的方案数。通过对 \(q_1\) 的讨论我们得出:对于 \(f_{n,j}\)\(j=n\) 时可以直接去掉它变成 \(\sum\limits_{i=1}^{n-1}f_{n-1,i}\),否则讨论第二个数,第二个数要么是 \(n\),这样可以直接删掉没有影响,要么一定 \(<j\),答案就是 \(f_{n-1,j}+\sum\limits_{i=1}^{j-1}f_{n-1,i}=f_{n-1,j}+f_{n,j-1}\)
到这已经可以过掉这题的垃圾数据范围了,不过聪明的你肯定发现了这个递推式就是最基础的格路计数,答案就是 \(f_{n,k}=\dbinom{n+k-2}{n-1}-\dbinom{n+k-2}{n}\),最终的答案还要乘上剩余部分的操作序列数,也就是 \(2^{n-k-1}\)。(注意减一,因为最后一个数从左取和从右取一样)
这样我们就成功踩掉了出题人整整一个 \(n\)

AGC019F

组合意义天地灭,代数推导保平安。去你妈的推式子,直觉才是永远的神。
观察这个对错序列,可以将其转化为格路,以下不妨设向左为“是”向下为“否”且左大于下。
这样我们要求的就是最优策略的折线和实际折线期望重合几个,而根据直觉来看最优策略应该是选剩下的更多的,反映到图像上就是尽量往 \(y=x\) 靠,至于相等的情况我们随便规定一个方向比如左。现在网格图上有一些线段被标记出来,表示最优策略下会走它们。
翻一翻玩一玩会发现一条任意格路穿过的标记线段总条数一定有个 \(n\),多出来的部分是相等时多走的几个左也就是穿过 \(y=x\) 的次数。
这个次数枚举 \(y=x\) 上每个点算一下概率即可,复杂度 \(O(n)\)

P3515 [POI11]

我们化一下式子,那个绝对值先不要,一会翻转一下序列即可:\(p_i=\max\limits_{1\le j\le i}\{a_j+\sqrt{i-j}\}-a_i\)
观察此函数的性质,容易发现它有决策单调性,可以拿单调队列维护最上面的函数,然后做的时候利用根号的性质二分交点,交点可以记录下来。
注意一下可能 \(n\) 之前没有交点(比如样例)的边界处理,总复杂度是单调队列加二分的 \(O(n\log n)\)

P1912 [NOI09]

很容易写出 dp 式子,然后发现这个函数斜率递增,所以直接同上决策单调性优化。

P3225 [HN2012]

求完割点后看一看连通分量里的割点数,只需要考虑少于两个的情况。

P3586 [POI15]

看上去是个傻逼性质题,稍微构造一下就可以得出式子,需要权值线段树求小于某个值的数值个数和数值和。

P3722 [AH/HN17]

很妙的题,首先要想到如何转化这个恶心的条件,发现可以通过枚举中间的最大值让贡献很好看:找到两边第一个大于自己的数(下标设为 \([L,R]\)),那么点对 \((L,R)\) 会带上一个 \(p_1\),以 \(L\) 为左端点右端点在自己和 \(R\) 之间的(反之亦然)点对带上一个 \(p_2\)
题目基本上是裸的扫描线,扫的时候遇到一个 \(L\)\(R\) 就给能做另一个端点的一个区间加一,再查这个点上的询问区间。

P4568 [JL11]

补一下,这种去掉很少条边的就是分层图最短路板子,到下一层表示免了一条边的费用。

P5304 [GX/GZ19]

很明显,有些最短路是可以一起求出来的,是哪些呢?
一种方式是按照二进制枚举每一位,求该位为零或一的点之间最短路,可以通过加源汇点实现。

ABC238H

这道题看起来无从下手,但是我们稍微转化一下变成出局序列对应的价值和。
直接做还是不好做,发现倒过来加人可以实现最优子结构,于是考虑区间 dp。
dp 需要先计算一个辅助数组 \(g_{i,j}\) 表示只剩 \(i,j\),中间全杀光的方案数。
然后再根据 \(g\) 计算 \(f_{i,j}\) 表示只剩 \(i,j\),中间全杀光的贡献和。
注意以上的 \(i,j\) 都表示 \(i\) 顺时针到 \(j\),答案就是 \(\sum f_{i,i}/n!\)

P7219 [JOISC20]

题目描述很复杂,总之就是任意一个黑矩形只能留至多一个星星。
这样就需要舍弃一些星星:从下往上枚举到一个星星时,判断舍弃和保留哪个更优。如果保留,那么影响到它的都要扔掉,而它会影响到一个底边极大、侧边到顶的矩形。

CF573E

首先可以搞出一个 naive dp:\(f_{i,j}=\max\{f_{i-1,j},f_{i-1,j-1}+ja_i\}\)
好了,你可以通过此题数据了
这显然是不行的。观察式子的形式,容易发现第二项是第一项斜率加 \(a_i\) 再右移得到的,这意味着决策点可以二分!
这样我们用一个能够维护区间加等差数列和插入数值的结构也就是平衡树即可解决。

CF575G

这个题非常板子,但是有很多细节比如前导零的处理、边数最小等等,需要仔细思考再开始写。

CF1634D

神奇的构造题。先考虑一下这个限制:大约是两倍的 \(n\) 去掉一点,这一点是最后确定的两个数。
接下来考虑这样的询问能干嘛,我们从小而不平凡的情况开始模拟:对于四个数,把 \(\dbinom 43\) 种组合都问一遍,可以发现最大的两个答案就表示它们补集中那个数不是零。
也就是说四次询问排除两个数,正符合上面的限制!

CF1634F

又是神奇的构造题。首先作差变成一个数列上区间加减,看到区间加减就想到差分。
普通的差分对于区间加一个满足 \(a_{n+1}=a_n\) 的数列前后两项正好抵消,那么对于斐波那契数列的 \(a_{n+1}=a_n+a_{n-1}\) 我们减去前两项即可抵消。

CF1631F

观察性质,容易根据题目限制和 Bézout 定理得出我们能得到的最小操作单位 \(g=\gcd\limits_{1\le i\le m}b_i\)
考虑这样的操作会带来什么变化:它恰好翻转了 \(\bmod g=0,\dots,g-1\) 的所有数。
也就是说我们按照余数看,所有余数被翻转的次数相同。那么按照余数进行背包 dp,在奇数次翻转和偶数次翻转之间转移。

CF1629F

看上去是一个无从下手的博弈论,怎么办呢?先尝试 dp 一下:\(f_{i,j}\) 表示操作了 \(i\) 次,有 \(j\) 次被加了的最优答案,容易发现选择数 \(x\)\(f_{i,j}=\min\{f_{i-1,j}-x,f_{i-1,j-1}+x\}\)。如何才最优呢?肯定是让小的尽量大,也就是 \(\min\) 里面两个东西相等。
最后我们得到了 \(f_{i,j}=\dfrac{f_{i-1,j}+f_{i-1,j-1}}2\),初始 \(f_{i,i}=ik\),然后就很容易推式子了。

ABC237H

板子得不能再板子了:建出回文自动机然后根据 Dilworth 定理转为求最小路径覆盖。

CF1626E

发现一个点的子树内有两个黑点就可以把这个点的父亲拽过来,所以我们将所有这样的关系连边,BFS 看哪些点能走到黑点。

posted @ 2022-02-13 19:43  ajthreac  阅读(74)  评论(0编辑  收藏  举报