2022.07.07 NOI模拟赛总结
1.时间安排
7:30~7:50 看题面
T1:树上DP题,或许是什么贪心题,感觉很麻烦,暴力也不好写。
T2:状压DP题,阶乘枚举一分都不给,感觉不可做。
T3:数据结构题,一眼40分平衡树,矩形的数据结构题估计也不可做。
7:50~8:30
写+调T3的40分,平衡树写的很顺利,没怎么调试。
(然后比赛结束了)
8:30~10:00
自闭想了很久怎么写T1的 \(n^2\) DP,最后决定还是写自认为很正确的贪心,直接从给定的两个点求出来所有点的最小时间取min,大样例居然能过,反正不是正解就没再想。
试着按套路二分答案转判定,似乎让问题更麻烦了……
10:00~12:00
想T2的暴力分,怎么用状压推都推不出来式子,按套路拆成方案和价值也没有用。
中间想了想T3正解分,也没什么结果,感觉能树套树但是复杂度过高而且也不一定能写出来。
result:
T1:0 T2:/ T3:40
(出现了!rank守恒定律,危 下一场 危)
2.反思
(J神说今天都是套路题%%%)
T1:
贪心从头错到尾,没一个部分是对的。
首先求最小时间不能从上往下,应该从下往上用类似DP的方式转移,因为叶子是已知的,要从已知推未知。
然后我的贪心直接钦定两个给定点间直接取端点,实际上正解就是在这个路径上做文章。
考虑把两个端点视作两个函数,那么显然是两个单调的函数。
L神认为这个能三分然后挂了,惨。正确做法是两个函数相减后仍然单调,而且当相减后函数值接近0的时候答案取到最值。
获得了这些信息就可以二分了。
考场上输麻了,完全没和正解接边,大概还是对单调性的感觉不够吧。
T2:
%%%J神暴切(场上卡常了),感谢J神赐教。
如果已经求出来了一棵mst,称这n-1条边为树边,剩下的为非树边,根据mst的性质,加入非树边后形成的那个环上的所有边权都小于这条非树边(这里边权为排列)。
根据这个性质,可以考虑从小到大枚举边权dp,这样如果当前枚举的非树边在mst中成环,环上的边必然用小于他的边权都填过了,这条边就不能选择,反之则可以。
于是可以状压树边的状态,用一个 \(n-1\) 位的二进制数表示前n-1条边是否被选(因为题目要求前n-1条边必须是一个mst),然后外层枚举当前的边权,内层,枚举边,按前n-1条和剩下的m-n+1条边分两类讨论(即树边和非树边)。
这样就得到了一个 \(O(2^n*m^2)\) 的算法,可以得到60分。
注意到一个确定的状态合法的非树边的转移形式相同,可以提前预处理出每个状态合法的非树边个数,计算贡献的时候直接用乘法原理,可以省掉枚举非树边的复杂度,只需要枚举树边即可。
到这里复杂度为预处理 \(O(n2^n)\) (sosdp),计算答案 \(O(m*(n-1)*2^{(n-1)})\) ,虽然有用的状态比较少,但是常数过大过不掉。
于是就要卡常了……
考虑枚举树边只需要枚举当前状态的补集的1的位置即可,可以用lowbit处理,这样复杂度就变成了 \(O(m*(n-1)*2^{(n-2)})\),少了一半的常数。(复杂度计算:\(\sum_{i=0}^{n-1}i*C_{n-1}^i=(n-1)*2^{(n-2)}\),可以看做每个位置都可能为1,其他位置有 \(2^{(n-2)}\)种状态)
实现的优美就可以过了,自己测试大概是850ms左右。
T3:
可持久化平衡树……真毒瘤啊
(待Upd)

浙公网安备 33010602011771号