2023.5.24 NOI模拟赛总结
多测不要用printf("%s");
!!!!!!!!!!!!!!!!!!!!!!
1.时间安排
7:00~9:00
10分钟过了一遍题面,会了T1的 \(O(\frac{n^3}{w}log n)\) 的二分+bitset优化DP判定,T2感觉是个树上DP,口嗨一下大概会了 \(n^3\),T3是个逆天的数数,大概只会爆搜的40分。
T1的二分+bitset优化DP判定是简单的,二分连续段长度的上界,令 \(f_{i,j,0/1}=0/1\) 表示前 \(i\) 个字符问号位置填了 \(j\) 个0当前段是连续的 \(0/1\)是否存在合法的放置方案,因为DP值是 \(0/1\) 所以可以简单用bitset优化。
但是这个不是很好写,就没写,换了个思路,感觉了一下bitset中是1的位置是连续的一段区间,所以可以把状态改成 \(fmn_{i,0/1}\) 表示前 \(i\) 个字符当前段是连续的0/1想要合法最少需要在问号处填多少个0,\(fmx_{i,0/1}\) 类似的定义,这样复杂度就变成 \(O(n^2log n)\) 了,简单好写,通过了所有样例。
考虑构造方案,相当于直接把DP的过程倒过来,也是简单的。
观察转移,是一段连续的区间,用树状数组优化即可,复杂的 \(O(nlog^2n)\),大概8:40写完,9点调完+卡常,可以拍上,虽然可以写单调队列但是树状数组跑的还是挺快就没管。
9:00~10:00
写了T3的暴力,可以过样例,算了一下状态数是 \(C_{值域}^{n}\) 的,转移复杂度还要乘上 \(O(n^2)\),对于60分大概是 \(3e9\) 级别的,而且还要乘上hash表的常数,寄。
10:00~12:00
T2无论如何都需要按照包含关系建树,先把建树部分实现了,然后考虑DP。
一开始想简单了,只考虑了父亲放在子树的缝隙中,没有考虑还可以继续下方到子树的子树的缝隙中,调了很久才意识到想错了。
先把状压和特殊性质写了,保住50分。
继续思考,发现状态是相当复杂的,不能简单的用区间DP的方式做。
剩下的时间不多了,就开始随机贪心乱搞,但是与大样例答案相差甚远,寄。
result:
T1:55 T2:50 T3:40
2.总结
T1:
看评测结果OLE疑惑了很久,突然发现woc怎么输出长度都相等,然后看代码printf("%s", t+1);
,看了一眼没有清空t恍然大悟,改成for(i:1->n);
就是100分了……
警钟长鸣
T2:
确实是树上背包。
其实决策还是比较简单的,对于父亲,有以下决策:
1 . 下放到某个子树的区间内。
2 . 放在最左/右侧,并把一部分下放到最左/右儿子的子树内。
3 . 放在两个相邻的儿子之间,并把一部分分别下放到这两个儿子的子树内。
设 \(f_{i,j,0/1,0/1}\) 表示 \(i\) 的子树内要放 \(j\) 个区间,最左侧是否要向外延伸,最右侧是否要向外延伸的最大区间长度。
按照题目要求 \(j\) 至少是子树大小,上界是2倍子树大小,因为一个区间至少要占用1个端点,而子树内只有2倍子树大小个端点。
分类讨论转移即可,树上子树大小限制背包复杂度是 \(O(n^2)\),还是比较好写的(确信)。
T3:
咕咕咕