2023.5.30 NOI模拟赛总结

1.时间安排

7:10~9:00

T1:见过的插头DP,不过似乎不用插头,直接按行DP就行,状态数感觉很少,虽然 \(n,m\) 是30。

T2:数据范围非常小的DP题,只会状压 \(n\) 和特殊性质的贪心。

T3:与lca有关的构造题,数据范围很小,看上去是个 n-sat ,感觉只会爆搜和乱搞。

T1原:[CQOI2015]标识设计

一开始看错了题,以为L型数量不限,只有3个那直接记录三个L向下延伸的位置就好了。

状态数最大是5000左右,但是转移常数非常大。

一开始写完的版本 \(30\times 30\) 个点需要跑4s左右,把枚举L型向右遍延伸的长度改为确定新增的L型后做DP就可以跑进1s,再卡卡常轻松300ms(+O2)。

9:00~10:30

想了很久T3,感觉没法改成 2-sat,因为有一个要求是每只兔子对应的 \(n\) 种位置的变量最多有一个是1,这个限制太难搞了,索性放弃,开始乱搞。

一开始写的退火表现很差,我是按照满足的限制数量来判断方案的优劣,50个限制只能满足30个左右。

后来想到每个限制可以看做每个点至少必须选在某些子树内,用 bitset 搞出来每个点只能存在的位置,这时候已经可以50个限制跑出来48个左右了,再去掉只有一种选择的点,已经有时候能跑出来解了。

然后就是卡常+微调参数,跑了100组有解的数据可以求出来97组的解,虽然数据是纯随机的吧,这个退火应该还是蛮强的,应该能过50。

10:30~12:00

先把状压 \(n\) 和特殊性质的贪心写了,没想到 \(d\leq 8\) 是干什么的,一开始一直以为不能确定点的放置顺序就没法做DP,就认为是给随机化的,又写了个退火,似乎 \(d\leq 8\) 稳定跑出来解,但数据是随的,不过无所谓了。

然后就摆了,给T3写了个spj,验证一下退火跑出来的构造方案,没啥问题。

result:

T1:100 T2:18 T3:45

2.总结

T2:

首先知道具体的位置并不需要DP求解,只需要考虑每个有点的位置,我们记录这样的位置是 1,没有点的位置是 0,如果 1 前面是 0 ,那么答案需要加上 \(a\),否则需要加上 \(min(a,b)\)

\(x\) 必须放在 \(x-d\)\(x+d\) 可以看做 \(x\) 必须放在 \(x-2d\)\(x\)

这样就可以设计 \(d\leq 8\) 的状压了,考虑状压 \(2d+1\) 个点,我们从前往后枚举,需要满足当前的状态中 \(x-2d\)\(x\) 至少有一个是 1,然后就可以状压DP,复杂度 \(O(2^{2d+1}max(x))\)

正解考虑根号分治,对于比较大的 \(d\),考虑每次填完所有对 \(2d\) 取模相等的位置,我们需要记录初始状态和当前状态,转移用轮廓线DP。

复杂度是 \(O(d(\lceil \frac{max(x)+1}{d}\rceil+2)4^{\lceil \frac{max(x)+1}{d}\rceil+2})\),在 \(max(x)=150,d=10\) 最大,大概是 \(4^{17}\times 10^2\),但是没有这样的数据,所以轻松跑过……

T3:

正解还真是 2-sat,可以把兔子 \(i\)\(j\) 号点这个变量改写为兔子 \(i\)\(j\) 子树内,这个子树随便找个根求一下就好。

这时候我们发现因为子树具有继承关系,就可以设计 2-sat 来求解,构造方案时求出来这只兔子所有可以存在的子树,找到深度最大的就是这只兔子在这个方案中的位置。

我们令 \(f_{i,j}\) 表示 \(i\) 是/否在 \(j\) 的子树内。

先不考虑题目的限制,我们需要满足如果 \(f_{i,j}\) 为假,那么 \(f_{i,k}[k\in son(j)]\) 为假,同样的,如果 \(f_{i,j}\) 为真,那么 \(f_{i,fa(j)}\) 为真。

然后是一个点只能出现在一个位置,所以某个点的所有儿子需要互相连边,这个可以用前/后缀优化建图做到 \(O(nm)\)

这样基础的限制就设置完了,接下来考虑题目额外给出的 \(q\) 个限制。

我们分类讨论,设 \(rt\) 是限制的根,\(x,y\) 是两只兔子,\(z\) 是限制的lca。

如果 \(rt=z\),那么等价于 \(x,y\) 不能同时存在于以 \(rt\) 为根的 \(rt\) 的儿子的子树内,注意到 \(rt\) 的父亲的限制可以通过用变量不在 \(rt\) 的子树内来表示在 \(rt\) 的子树外。

否则,如果 \(z\)\(rt\) 的子树内,那么只需要讨论 \(z\) 的所有儿子的子树。

否则,如果 \(z\) 不是 \(rt\) 的祖先,与第二种情况类似,否则需要找到 \(rt\)\(z\) 的链上深度最浅的点,讨论一下,这个点是容易 \(O(n^2)\) 预处理的。

于是就做完了,复杂度 \(O(n(n+m+q))\),似乎比题解优?

posted @ 2023-05-30 19:49  Displace  阅读(18)  评论(0)    收藏  举报