别样的 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。

posted @ 2024-11-12 23:13  LCat90  阅读(59)  评论(0)    收藏  举报