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:

咕咕咕

posted @ 2023-05-24 17:35  Displace  阅读(10)  评论(0)    收藏  举报