Grandmaster 计划试题乱做 Part 2

1. CF1601D Difficult Mountain \(\checkmark\)

随笔

首先山的高度单调不降,如果一个人现在上不了山,以后就更上不了,直接扔掉
对于 \(s\leq d\) 的人直接上山即可,然后贪心的选剩下人里 \(a\) 最小的更新 \(d\)
好像不大对(

soltion

上面贪心得不太对,正确贪心应该是对于 \((\max(a_i,s_i),s_i)\) 排序
正确性证明容易通过讨论说明
神仙贪心还是做不会
学习这样一个 dp 的做法
仍是按 \(a\) 从小到大排序,发现选取的顺序不一定是排序后序列的子序列
考虑最终选取序列的前缀最大值 \(k\),称其前一个前缀最大值位置为 \(l\)
我们可以将最优选取序列中放在 \(k\) 后前不到下一个前缀最大值的一段称为被 \(k\) 覆盖的一段
那么每个位置可以尽量往前面的段放,即若 \(i\)\(k\) 覆盖,则 \(a_i\leq a_k,a_i\geq a_{l}\)
故我们可以 dp
\(f_i\) 表示以按 \(a\) 排序后第 \(i\) 个位置为当前最后一个前缀最大值的选取序列中最多能选多少位置
转移即 \(f_i=\max_{j}{f_j+\sum_{k=j+1}^{i-1}[s_k\geq a_i]}\)
容易用线段树维护

2. CF1572C Paint \(\checkmark\)

随笔

可以暴力 \(O(n^4)\) 区间 dp,发现对于一个区间染成一个颜色的 dp 值 \(f_{i,j,c}\) 只会有两种取值
大概可以转换一下状态勉强做到 \(O(\frac{n^3}{\omega})\)
好像无论是时间还是空间都过不了(
不大会用那个 20 的性质

solution

关键性质:对于一个区间 \([i,j]\),将其全部染成 \(c_i\) 一定是最优解之一
我们的状态就不需要管颜色这一维了
对于新的状态 \(f_{i,j}\) 表示将 \([i,j]\) 染成 \(c_i\) 所需的最小代价
容易转移,\(f_{i,j}=\min{f_{i-1,j},f_{i,j-1}}+1\\f_{i,j}=\min_{c_k=c_i}f_{i,k-1}+f_{k,j}\)
时间复杂度 \(O(20n^2)\)

小结

状态维数过多应去找性质简化

3. CF1617D2 Too Many Impostors (hard version) \(\checkmark\)

随笔

自闭场赛时没 rush 出来题
核心思想就是先找到一对 01,然后其他的直接询问这对 01 得到结果
没啥思维难度,细节有点多

solution

走个流程

4. CF1566F Points Movement \(\checkmark\)

随笔

首先简化状态,将包含 \(a\) 的线段丢掉,将包含其他线段的线段丢掉
这两个事情能用单调栈、双指针解决
此时留下的问题性质很好
形式满足每两个相邻 \(a\) 点间有一些左右端点同时递增的线段
记解决完前 \(i-1\) 段,第 \(i\) 个点先往左/右走的最优答案即可

solution

如上

5. CF1554E You \(\checkmark\)

随笔

不会啊,胡乱树形 dp 没啥前途
似乎甚至想不出来咋求 \(a\) 的合法数量

solution

草,看错题了(,不是把第 \(i\) 个删掉的点当前的度数放在 \(a_i\)
首先考虑合法 \(a\) 的数量
对于原题的一种删点方案,每删掉一个点 \(x\) 就把与其相邻的未删的点 \(y\) 到其的边定向成 \(y\to x\)
最后会得到一个无向边经过定向后的树,\(a\) 就是这颗定向后的树每个点的入度序列
显然是双射
那么合法 \(a\) 的数量即将树定向的方案数 \(2^{n-1}\)
容易想到考虑叶子,其度数只有 \(1\),在 \(k\neq 1\) 的情况下,其一定要比其父亲后删掉
然后把叶子去掉,剩下的树的叶子的 \(a\) 值仅取决于其父亲,继续做上述操作即可,容易判断无解
容易发现对于 \(k>1\) 的情况有解即有唯一解,我们仅需求得所有 \(k>1\) 的答案,容易得到 \(k=1\)
由于 \(\gcd(a_1,a_2,\dots,a_n)=\gcd(\sum a_i,a_2,a_3,\dots,a_n)\),而 \(\sum a_i=n-1\)
所以 \(\gcd\) 一定是 \(n-1\) 的约数,对每个约数做一遍即可
事实上对 \(n-1\) 的每个素因子做一遍拓扑排序即可,求出实际方案得到的 \(\gcd\)
时间复杂度 \(n\omega(n)\)

6. CF1615E Purple Crayon \(\checkmark\)

随笔

赛时没搞完题,寄!
将博弈的结果 \(w(r-b)\) 仅用 \(r,b\) 表示,得到 \(r(n-r)+b(b-n)\)
这个式子我们直接考虑直接枚举 \(r\),那么 \(b\) 的贡献是一个向上开口的二次函数,我们只要使得 \(b_{max}\) 尽可能小
考虑怎样选红色节点能让蓝色节点能选的尽量少,容易发现一定是选 \(r\) 个叶子
那么问题变成选 \(r\) 个叶子使覆盖的祖先节点尽可能多
问题的做法是贪心选长链即可,具体证明可以通过建立一个费用流模型

solution

走个形式

7.CF1615F LEGOndary Grandmaster \(\checkmark\)

随笔

考试没开到题,赛后好像没啥想法,不大懂咋计算固定串的答案

solution

首先考虑最重要的问题——计算固定串答案
对题意进行一步重要转换,将 \(s,t\) 串的偶数位翻转,那么原本的操作相当于交换两个相邻位
原因是在新串中子串 xx 交换没有意义,其操作也在原问题中不合法
那么情况有解的充要条件即新串 \(\operatorname{popcnt}\) 相等
那么这个固定串的答案即 \(\sum_{i}|x_i-y_i|\),其中 \(x\)\(s'\) 中 1 的位置序列,\(y\)\(t'\) 中 1 的位置序列
再进行一步转化,将合法情况的答案变成 \(\sum_{i}|a_i-b_i|\),其中 \(a,b\) 是两新串的前缀和序列
具体意义就是计算跨过某位置的交换个数之和
然后容易 \(O(n^2)\) dp

小结

题意转换需更加熟练

8.CF1620G Subsequences Galore \(\checkmark\)

随笔

好像能编出一个复杂度不大对的做法,通过大力卡常通过了此题
由于题目保证字符串升序,那么对答案有贡献的串也将是这个形式
可以 dp 一个集合恰好全部包含的子序列串个数,大概就是对于一个串,其只对 \(n\) 个母串中包含其的所有串所构成的集合有贡献
然后对于字母升序转移,发现串在加上若干个 \(c\) 字符后,集合将进行一定的收缩,容易做到转移 \(O(n)\)
得到 \(dp\) 值后,答案实际上是 \(g_s=\sum_{t\&s\neq 0}f_s\) 可以用 fwt 求得
总复杂度 \(O(2^nn|\Sigma|)\)
理论上很卡,具体实现可以通过优化取模、无效 dp 值扔掉等方法卡常

solution

鸽掉 std 做法了

9.CF1575M Managing Telephone Poles \(\text{鸽}\)

随笔

以为每个关键点控制的区域是四联通的,直接冲了一发最短路 WA on 6
改成八联通交上去 WA on 9,想了想发现好像不存在这样的条件?
再编了编感觉可以 dp 一下,斜率优化就做完了?

solution

确实如此

10.CF1575E Eye-Pleasing City Park Tour \(\text{鸽}\)

随笔

感觉点分治一下就做完了?
好 sb 的样子

solution

确实如此

posted @ 2021-12-20 09:31  juju527  阅读(173)  评论(0编辑  收藏  举报