省选集训day7
省选集训day7
考试
T1
T2
我们考虑没有环并且对覆盖次数没有限制的版本,我们对所有点拓扑排序,然后从小到大枚举每一个点,用 \(f_{i,j}\) 表示第一条路径结尾在 \(i\) ,第二条路径结尾在 \(j\) 的方案,假设当前枚举的节点是 \(k\) ,前面 \(k-1\) 个点都至少被一条路径覆盖,我们看看 \(k\) 被谁覆盖,有下面五种情况:
其中,转移 \(1,2\) 针对的是覆盖 \(k-1\) 的路径延伸过来,\(3,4\) 对应是从另一条路径覆盖过来的情况。\(5\) 是两条路径都延伸过来的情况。这个是 \(O(n^2)\) 。
有环的话我们直接 tarjan 缩点,对于每一个连通块的每一个点,我们都可以用前缀和弄,所以复杂度不变。
T3
所有这样的题都十分套路:用迭代法。假设我们考虑的是前 \(b\) 个数字,其中满足性质的数的比例为 \(a\) ,并且满足 \(\dfrac a b <p\) ,我们找到最小的 \(c,s.t.\dfrac{a+c}{b+c}\ge p\) 然后我们把 \(c\) 加到 \(b\) ,重新计算 \(a\) ,这个过程可以用数位 dp,我们不断迭代这个过程就为答案。
杂题选讲
1 Bytelandia States Union(Grand Prix of Belarus H)
给你一个坐标系和两个坐标,从任意一个坐标向上走的代价是 \(2xy^2+2y^2+x^2\) ,向下走的代价是 \(-2x^2y+2y^2+x^2\),向左走的代价是 \(2xy^2+2x^2+y^2\),向右走的代价是 \(-2x^2y+2x^2+y^2\)。
不难发现,出题人为了让简单的题变复杂,总是包装自己的题意,不难发现,从起点 \((x_1,y_1)\),走到 \((x_2,y_2)\),所需要的总代价为:
我们拆一下贡献:
我们考虑怎么把最后这一项最小化。
根据贪心策略,我们走两个坐标中最小的那一个,分情况讨论起点和终点的相对距离,这个题就做完了。
2 Border Similarity Undertaking(Grand Prix of Belarus F)
给一个矩形,每一个格子有一个小写字母,需要计数所有满足如下条件的矩形:边界上的字母相同。
我们考虑矩形分治,分治长的那一个边,然后考察经过这条线的矩形。我们直接预处理所有点能往左往下往上往右扩展的最大长度,然后我们固定一个上边界,枚举下边界,就可以在 \(n\log nm\) 的时间复杂度内做完。
3 Beautiful Sequence Unraveling(Grand Prix of Belarus B)
我们定义一个序列 \(a\) 是完美的,当且仅当存在一个下标 \(i\) ,使得 \(\max(a_1,a_2,...a_i)=\min(a_{i+1},a_{i+2}...a_n)\),现在给出序列长度 \(n\) ,以及序列的最大值,要计数有多少这样的序列。\(n\le 400,k\le 10^18\)
我们设状态 \(f_{i,j}\) 表示长度为 \(i\) ,包含 \(1,2,...j\) 的美丽序列方案数,或者有多少个不同的数。不难发现,\(k\) 这么大其实是吓唬人的,因为我们的状态的第二维实际上满足 \(j\le i\) ,因为剩下的我们只需要乘上一个组合数。
我们设 \(t\) 为满足 \(\max(a_1,a_2,...a_i)=\min(a_{i+1},a_{i+2}...a_n)\) 的最大的下标 \(i\) ,设 \(m=\max(a_1,a_2,...a_i)=\min(a_{i+1},a_{i+2}...a_n)\) ,不难发现,有以下性质:
-
\(t\) 右边的元素都大于等于 \(t\) 左边的元素。这个显然。
-
\(t\) 右边也是完美序列。
证明:利用反证法。假设 \(t\) 右边不是完美序列,根据性质 \(1\) ,我们就可以找到一个 \(t’\) 满足 \(\max(a_1,a_2,...a_{t'})=\max(a_t,a_{t+1},...a_{t'})=\min(a_{t'},a_{t'+1},...a_n)\),这与 \(t\) 的最大性矛盾。故原命题成立。
另一个很显然的事情是美丽序列方案数等于总方案数减去不美丽的方案数。
我们先列出 \(m,t\) 对 \(f_{i,j}\) 所做的贡献:
什么意思呢?右边那个括号指的是 \(t\) 左边的那个美丽序列是由小于等于 \(m\) 的元素组成的,而 \(m^t\) 是它的总方案数吗,之所以要减去 \({(m-1)}^t\) 是因为我们要保证有一个元素是 \(m\) ,\(t\) 右边的那个美丽序列的长度是 \(i-t\) ,由大于等于 \(m\) 小于等于 \(j\) 的元素组成,那么这个序列的总个数是 \(f_{i-t,j-m+1}\),之所以要减去 \(f_{i-t,j-m}\) 是因为要保证一个元素是 \(m\) 。
同时我们用前缀和去优化上面这个 dp ,复杂度可以做到 \(n^3\)。
4 Bookcase Solidity United(Grand Prix of Belarus K)
有 \(n\) 个书架,它们上下叠放在一起,每一个书架有一个称重量 \(a_i\) ,当称重量达到 \(a_i\) 时书架会塌,这时该书架上面的重物的一半会调到下面这个书架上。每一个苹果带来一个单位称重量,问最多需要多少个苹果能把书架压塌。 \(n\le 70,a_i\le 150\)
我们设 \(f_{i,j,k}\) 表示把 \(i\) 到 \(j\) 的书架压塌剩下 \(k\) 个苹果的最小花费。转移比较明显:
这里 \(k\) 的最大值是 \(\max(a_1,a_2,...a_n)\)
我们用区间 dp 做一下即可。
5 Cactus Competition(Grand Prix of Korea B)
这个题没有很听懂。
从 \((1,1)\) 到 \((n,m)\) 走不通的充分必要条件是:
- 有一行走不通
- 有一列走不通
- \((1,1)\) 被包起来了。
- \((n,m)\) 被包起来了。
证明:
必要性显然。下面证充分性。
如果这四种情况都不符合,那么我们一定有 \(\min A_i+\max B_i\ge 0,\max A_i+\min B_i\ge 0\),这样一定存在一条通过 \(i,j\) 的路径。这个问题已经变成了一个规模更小的一个子问题。得证。
于是我们分别对上面的四种情况算出所有 \((s,e)\) 不满足条件,然后把他们画到坐标轴上就是求矩阵面积并的一个题。
6 Query On A Tree 17(Grand Prix of Korea I)
答案肯定是求树的重心,对于修改,我们树链剖分即可。我们观察到中位数一定在答案所在的子树里,所以我们找出中位数然后二分位置就可以消耗到答案。
7 LCS 8(Grand Prix of Korea G)
题目大致意思是给你个序列 \(a\) ,给定一个 \(k\) ,要求计数所有的长度为 \(n\) 的序列 \(b\) 使得两个序列的 lcs 为 \(n-k\) 。
这是一个 dp 套 dp 的题,目前并不会代码实现,所以我们只是看一下思路。
设 \(f_{i,j}\) 为做 lcs dp 时的状态,我们需要记录 \(f_{i,0},f_{i,1}...f_{i,n}\) \(O(n^{n+2})\) 的空间。
观察到相邻两个 \(f_{i,j}\) 的值只相差 \(1\) 或 \(0\) ,于是我们可以把空间复杂度优化至 \(O(n\times 2^n)\)。
观察到只有 \(|i-j|\le k\) 的状态是有用的,这是因为如果两边相差 \(k\) 以上的话,肯本不可能出现 lcs 为 \(n-k\) 的情况。同理,有 \(f_{i,j}\ge k\)。
我么压缩复杂度为 \(O(2^{2k}\times (k+1))\),\(2k\) 是因为绝对值包括正负两种情况。
转移即可(其实不大会转移)
8 Mr. Panda and Cactus(CCPC Final 2018 E)
这个题最终会分为 \(k\) 个连通块。
在仙人掌上,除了那些树边,我们还需要关注一个环上的边。设 \(f_{i,j}\) 考虑前 \(i\) 个环,第 \(i\) 个环删了 \(j\) 条边的方案数,发现删 \(j\) 条边会有 \(j+1\) 个连通块。
我们直接 dp 转移就可以了。
9 GCD Land(CCPC Final 2018 C)
要求构造一个 \(x\) 满足在把 \(1\) 到 \(n\) 的所有数加上 \(x\) 后,我们对所有不互质的两个数连无向边,然后整张图是一个连通块。
我们考虑这样一个问题,我们找到一个素数 \(p\) 小于 \(\frac n 2\) ,使得 \(i,j\) 对 \(\bmod p\) 同余,实际上就是 \(|j-i|\) 的一个素因子,我们就可一构造一个这样的 \(x\)。我们从中间往附近连边,然后这样做的话除了 \(x+1\) 和 \(x-1\) 我们都连上边了。对于这两个非常毒瘤的数,我们考虑用两个最大的素数练到对面的点上去,这样没有连得就有 \(4\) 个数,然后再找几个大于 \(\frac n 2\) 的素数把它们 \(4\) 个连回来。
10 Summer Dichotomy(CF round 300 H)
老师的厌恶关系是一个二分图,我么把所有区间放在坐标系上就可以通过数据结构维护。这些区间
这个题没有很听懂。
11 Financiers Game(https://codeforces.com/problemset/problem/729/F)
我们考虑最暴力的 dp。
设 \(f_{i,j,k}\) 表示左边拿了 \(i\) 个,右边拿了 \(j\) 个,最后一次拿了 \(k\) 个,现在 Alice 拿的时候的最值。
设 \(g_{i,j,k}\) 表示左边拿了 \(i\) 个,右边拿了 \(j\) 个,最后一次拿了 \(k\) 个,现在 Bob 拿的时候的最值。
然后明显有如下转移:
如果不理解,请注意我们最大化的是差值。
不难发现 \(k\) 是 \(O(\sqrt n)\) 级别的。而 \(|i-j|\le k\) ,因为不可能相差比 \(k\) 大。由此,这个 dp 实际上是 \(O(n^3)\) 的复杂度。
12 Rento(https://cometoj.com/contest/18/problem/H?problem_id=266)
我们设 \(f_{i,j,k}\) 表示第 \(i\) 个人第 \(k\) 轮第一次走到 \(j\) 的概率。设 \(g_{i,j,k}\) 表示第 \(i\) 个人前 \(k\) 轮从没走到 \(j\) 的概率,第 \(j\) 块地在第 \(k\) 轮被 \(i\) 占领的概率是 \(f_{i,j,k}\times g_{1...i-1,j,k}\times g_{i+1...6,j,k-1}\)。
这个概率都是对期望的贡献,只需要算出 \(f,g\) 。
设 \(v_{i,j,k,l}\) 表示第 \(i\) 个人前 \(j\) 轮 从来没有到过 \(k\) 当前在 \(j\) 的概率。那么:
但是我们并不能计算 \(v\) 数组。这是一个 \(36\times n^3\) 的复杂度。
注意到 \(f_{i,j,k}=\sum\limits_{x=1}^nf_{i-1,j-k,x-1}\times p_{i,x}\)
所以这个 dp 就变成了 \(36\times n^2\)
(最后一个没有听懂)