T20200824
T1 基因合成
神奇的题面描述,这个不管
简言之,求通过给定操作,求到目标状态的最少操作次数
操作如下:
- 在串的头部或尾部插入一个字符
- 将串复制一次,逆序接在原串的后面
\(60\)分做法
先说说\(Dp\),状态设计: \[ f(i,j)=min \begin{cases} f(i+1, j)+1 \\f(i,j-1)+1 \\f(i,mid)+1\quad\text{i到j长度为偶数,且这是回文串} \end{cases} \] \(60\)就到手了
Code
1 |
|
\(100\)分做法
再看看这道题,我们发现有一个性质:
- 某个复制操作可能是被另一个复制操作所包含的,但是两个复制操作是不可能并列的
那么我们就可以找到每个长度为偶数的回文串,用\(f(i)\)表示在回文数下节点编号为\(i\)的回文串的最小生成步数,\(len(i)\)表示回文串长度
那么答案就可以这样更新\(ans=min(ans,n-len(i)+f(i))\),因为回文串以外的字符只能选择插入了
考虑如何更新\(f(i)\): \[ f(i)=\min\{f(j)+1,len(i)/2-len(tran(i))+1\} \] 其中\(tran(i)\)表示回文串\(i\)的某个能够通过最少次操作得到\(i\)的子串
这道题就差不多结束了
Code
1 |
|
T2 染色
给定一棵树,初始状态所有的点全为白点
有如下两种操作:
- \(opt=1\),将\(x\)染为黑色
- \(opt=2\),求所有黑点到\(x\)的简单路径长
\(30\)分做法
直接暴力跑,这个树是随机的,嗯就完了吧
\(100\)分做法
考虑根为\(1\)的树上,一对简单路径长度: \[ len = dis(u,1)+dis(v,1)-2\times dis(lca(u,v),1) \] 这个显然是正确的,那么所有黑点到\(x\)的距离为: \[ \begin{align*} Ans&=\sum_{i=1}^{cnt}(dis(u_i)+dis(x)-2\times dis(lca(u_i,x))) \\&=\sum_{i=1}^{cnt}dis(u_i)+cnt\times dis(x)-2\sum_{i=1}^{cnt}dis(lca(u_i,x)) \end{align*} \] 那么这个问题就变得相对简单了,\(dis(x)\)直接预处理,\(\sum_{i=1}dis(u_i)\)可以直接暴力加上去
那么问题就变成了求\(\sum_{i=1}dis(lca(u_i,x))\),这个我们可以发现,\(lca(u,x)\)一定在\(u\)到根和\(x\)到根的路径上
就是说我们要求\(dis(lca(u,x))\)的话,可以直接求\(Dis(x)\)
即,每次插入一个黑点,将这个点到根的路径上的所有的边权的加入贡献,再求\(x\)到根经过的边的贡献之和
Code
1 |
|
T3 圈地游戏
这,我就懒得描述了
考场上没有思路,怎么设计状态?如何进行转移?
啥都没想到,都不会。。。
BUT
赛后诸葛。。。
我这里没有部分分做法
\(100\)分做法
状态设计\(f(x,y,state_t, state_b)\),表示当前位置为\((x,y)\),在路径内部的宝箱状态为\(state_t\),路径障碍状态为\(state_b\)
规定射线垂直\(y\)轴,没有斜率方便表示
那么判定依据如下:
1 | if ((New.X == Tx[i] - 1 && Now.X == Tx[i]) || (New.X == Tx[i] && Now.X == Tx[i] - 1)) |
就是没经过这条射线一次,就对这个宝箱/障碍进行一次亦或操作,因为异或操作有一个性质,相信大家都明白,就不细说的
这个就很好的满足了经过奇数条边,那么就在图形内,偶数条边就在图形外的条件
那么最难的部分就结束了
Code
1 |
|
这确实是非常好的一道状压\(\text{Dp}\)
这道题大家就栽在不知到如何用二进制表示宝箱、陷阱的状态
虽然题目对于路径内外有十分详细的描述,但是没有做过的话,还是不容易想到这种表示方法