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)

posted @ 2022-07-07 14:33  Displace  阅读(92)  评论(0)    收藏  举报