别样的 Duel 大战 | From 11.11 ~ 11.12
Lovely_CatHxy 和 Ghost_Huang 已经大战数 10 局了,全部都是 LCat 胜利!!!
都是 hxy 为什么偏偏你这么厉害呢(((
CF1257F
tag:简单题 *2000
推一下式子,设 \((i,j)\) 表示前面选 \([1,i]\) 后面选 \([j,n]\)。式子里面就尽量不要写和 2 有关的了。
考虑分析 1 和 3 需要进入的点有多少个,然后再加上需要给 2 放多少个即可。
预处理 \(f(i)\),扫描 \(j\),维护前缀 min 的 \(f(i)\),答案就是 \(\min\{ g(j)+ \min_{i<j} f(i)\}\)。
CF233B
tag:dp,贪心 *1900
一定要设计对状态:包含第 \(i\) 位能匹配到的最大位置。对于前后缀分别求一次。判定就是:要求所有 \(pre_i\ge nxt_i\)。
考虑如何转移,显然可以从上一个字符相同的位置转移过来。凭直觉:还需要考虑前面最大的匹配位置能否扩展,可以就更新。容易证明这样转移是充分的。
CF138D
tag:sg,dp,翻转坐标 *2500
说实话还是没有搞懂坐标怎么翻的。
CF1866D
tag:dp 优化 *2300
按列 dp。设 \(f(i,j)\) 表示前 \(i\) 列选了 \(j\) 个位置。钦定前面位置不能选了。转移考虑枚举 \(i+1\) 列选几个位置,单次转移平方。整体三次方。
考虑状态数优化,发现一个 \(i\) 的合法 \(j\) 范围是 \([i-k+1,i+k-1]\),是 \(O(k)\) 级别的。直接暴力 map 记录状态即可。时间复杂度 \(O(nmk\log ?)\)。
CF1901E
tag:树形 dp *2200
独立写出了需要换根的还没有写换根的做法。但是要维护 4 个东西的 mx 和 mxx,太懒了所以去看题解了。
发现不换根可以做,只需要不钦定当前点必选。
具体地,这个题本质就是不允许 deg = 2 的点出现。考虑 \(f(x,j),j\in [0,3]\) 表示有几个儿子,3 表示大于等于。
\(x\) 这个点自己的点权在转移最后加上,注意 2 不能加。
注意从 \(to\) 到 \(x\) 的时候 \(f(to,2)\) 要加上 \(a_{to}\),1 不能选自己,要减去。
CF1114D
tag:区间 dp *1900
不要看错题了。注意一开始选定了一个位置。
容易发现一个区间最后的颜色是 \(a_{l/r}\),根据这个可以 \(O(1)\) 转移。
CF856D
tag:树形 dp,LCA,树上操作/差分 *2400
1 个月没写树了居然一发过了。
考虑对于每个可加边,在 LCA 处考虑他的贡献。设为 \(z\)。
发现 \(x\to z\to y\) 的路径上的点都不可以和其他的可加边有交了。画图理解一下。
本来我们的 dp 转移是子树求和,现在就需要把链上的这些点给减掉。
具体地,\(all(x)\) 表示子树的 dp 和。(\(dp(x)\) 表示这个点可以被可加边选中的 \(x\) 子树内的最大和)
用数据结构给每个点维护:\(all(x)-dp(x)\)。每条可加边的转移:\(dp_x=\max\{all_x+val+f(x,p_x)+f(x,p_y)\}\)。\(f(x,y)\) 表示从 \(i\) 到 \(j\) 路径上每个点维护的值的和。
单点修改链查询,可以用 dfn + 树剖做到 2log。也可以树上差分用线段树做到 1log。
CF509F
tag:区间 dp,树形结构 *2300
几乎做过一道一模一样的题,所以独立切了。
每次转移显然 \(a_l\) 是一定作为根的,然后枚举儿子。如何枚举?
钦定选中左儿子。即区间 \([l+1,k]\)。然后要保证右边 \([k+1,r]\) 是个森林。为了方便我们就给他钦定一个虚的根 \(a_k\)。所以转移是 \(dp(l+1,k)\times dp(k,r)\)。
注意还有转移 \(dp(l,r)\leftarrow dp(l+1,r)\),意义是 \(l\) 只有 1 个儿子。
题解中还有一种做法:设 \(f(l,r)\) 表示一棵树,\(g(l,r)\) 表示森林,互相转移即可。
CF1242C
tag:基环树(置换环),状压 dp *2400
差不多想到了正解,但是差一点细节。
注意到元素互不相同,而且我们知道所有组最终的和。所以如果选了一个位置 \(x\),我们就知道另外一个一定要移过来的位置 \(y\)。连边 \(x\to y\) 表示有 \(x\) 则必须有 \(y\)。
点数是 \(kn\) 的,看成一般排列问题,也是 \((E=n,V=n)\) 的图。所以是若干个内向基环树。
分析知只有环上是有用的。所以先 topo 一遍再 dfs 对每个环考虑。
题目限制相当于是要求每个环中同一行的数只能出现 1 次,这个好判断的。那么剩下的就是一个简单的子集 dp 了。代码有点难写,主要是细节多。
corner case:一开始已经不用操作的行特殊处理。
CF1674G
tag:图论,DAG dp *2000
首先先把所有 \(in=1/out=1\) 的点处理了。
然后发现就可以在剩下的图里面找一条最长路径。尝试构造删边方式使之存在:每个点选择不在这条链的边删除即可。因为保证了 \(in_i/out_i\) 都大于 1,所以一定有解。
最长路径直接 DAG 上 dp。
CF1799D2
tag:ds 优化 dp *2100
同 CSP-S T3。