5.9模拟赛赛后总结
比赛历程
8:05看题,发现三道998244353,有点鬼畜。
看T1首先打了全排列,然后想到了题解中的,最大独立集中的点一定在它的出边所连的点前边,然后我就想先状压找出所有最大独立集,然后针对每一个来考虑合法放置有多少个排列,先放独立集的点,然后剩下的点随便放,这个方案怎么统计?不会。
想着想着发现文件夹放的不是位置,然后我换了个目录建造了同名文件夹,把东西复制进去,然后从这个文件夹点开了3道题(伏笔)。
想到9:30无果,去看T2。
T2很快想到了类似拓扑的东西,可以从下往上比较每个值在当最大值和当最小值传递的时候能够上传的概率,复杂度大概是(O(n^2))的,但是中间细节还挺难调。终于对了自己的样例,发现交上去怎么都是错。自闭了。
11:10放弃爆零的T2,去看T3,随机游走好啊,小数据dfs模拟就行了,迅速打完交上去,又是0分。我真自闭了。
就这样维持着总分10分到达了12:50。
赛后发现
1 由于换了比赛文件夹的根目录而我先前在那个根目录里查找过题目文件并提交,所以我后来交T2T3的时候都是直接在原来的根目录里交我建好的只有头文件的T2和T3,赛后一看交上去的代码只有400B(赛时提交上去连代码状态都不给看太离谱了),才意识到了这个问题。。。
2 然后我的T3实际上能有20分。而T2确实有问题,发现由于值不一定都是从最深的地方向上,如果一开始就找所有叶子到到队列里,那么有时候就会出现不能比较一个点会出现的所有值的情况,所以需要每一层每一层的考虑,然后就能过了。
3 实际上如果不是文件搞错了,赛时得分很有可能是10+40+20......
4 T1就差最后一步了,还是状压计数没学好。T2题目没看全,说是保证每个节点最多两个儿子。。这不就更简单了吗。
简单题解
T1,最大独立集中的点一定在排列中早于它的出边出现,所以可以考虑状压枚举已经考虑过的点集f[i]的各种大小的独立集的方案,然后向f[i|a[k]]转移,其中a[k]表示点k以及它所连的点的二进制状态,点k一定不在i中,否则k就会被i中的某一个a[s]给统计过了,而转移的过程中,每加入一个点就会向f[i][j]中贡献A(n-g[i]-1,a[k]-(i&a[k])-1)倍的方案数(就是加入k点后在剩下的位置挑选k的相邻点来排列),最后输出f[1<<n][maxx]就好了。
T2 由于每个节点最多只有两个儿子,所以只用保存左儿子和右儿子,统计也变成了单对象的区间比较和单对象的区间计算,如此一来可以进行线段树合并。
T3 暂且放掉了。