2023.6.30 NOI模拟赛总结

1.时间安排

7:20~8:30

T1:多重背包背景,背包大小、物品数量和权值特别大,但是物品种类数和重量非常小,感觉是个诈骗题。

T2:本质上是个DP题,第一眼看上去很复杂,但是看操作类似在区间选择一个点然后分裂成两个小区间应该是个区间DP。

T3:可以简单树剖线段树优化建图,时间 \(O(nlog^3n)\),空间 \(O(nlog^2n)\),但是起码有60分。

看到部分分是数量一定是一个2的幂减1,猜想可能跟二进制拆分有关,但是这个方面没有推出来做法。

然后想了一种贪心的做法,先按照密度排序,然后尽量选大的,但是直接这样贪肯定不太对,可能最大密度的数可以选出来一部分换成一种密度稍小的但是能把背包塞满。

但是可以乱搞,可以强制背包剩下一定的容量,其他的容量做按密度的贪心,剩下的容量做多重背包,一开始选的阈值是2000,暴力做 \(n2000^2\) 的多重背包,过了大样例。

之后上了个暴力对拍,挂了,就把阈值放大,改成做二进制拆分背包,正确率提高了,但是还是会拍挂。

暂时没什么想法,而且T3的60分是简单好写的,就先搞T3了。

8:30~9:30

把T3的树剖线段树优化建图写了,本来不报希望,结果测大样例1s都不到,虽然大样例是个链。

自己造了一些随机的数据,发现都跑的飞快,感觉除非刻意卡树剖很难卡满,就不改了。

9:30~12:00

一开始没太看懂T2的题意,疑惑了很久才意识到是区间DP,可以大概推出一个枚举区间中跳转到哪个点然后分裂出两个区间,取个min,在外层取max,大概是 \(n^3\) 的。

实现了一下,因为大样例是3000,所以跑了十几分钟,不过起码正确性没问题。

稍微改了改DP式,让它好看一些,然后发现跑1000很快,就稍微卡了卡常,本地带O2大概跑900ms。

之后就按套路猜四边形不等式,实现了一下寄,一直以为是自己细节写挂了,最后猜意识到也许就没有决策单调性,不过感觉区间DP除了决策单调性没什么优化途径了,就摆。

result:

T1:85 T2:45 T3:100

2.总结

T1:

事实上二进制拆分后是可以做的,需要一个叫数位背包DP的东西。

二进制拆分后,每个物品都是形如体积是 \(a\times 2^{b}\) 的形式,设 \(f_{i,j}\) 表示从高到低考虑到第 \(i\) 个二进制位剩下的背包体积是 \(j\times 2^{i}\) 的最大价值,做一个01背包,向低位转移的时候需要根据 \(m\) 讨论一下下一层的大小,\(j\) 这一维只需要开需要的大小即可,具体的是 \(O(n\sum a)\),这样复杂度可以做到 \(O(n\sum alog^2V)\)

T2:

神奇性质题。继续推一推式子可以推出来更简洁的形式:

\[f_{i,j}=\max_{k=i+1}^{j-1}\{\min(g_{i,k},f_{k,j})+d_k+(s_k-s_i)^2\} \]

打表发现 \(f,g\) 单调,于是可以维护 \(\min\) 取值的变化点 \(p\),打表发现 \(p\) 在固定 \(j\) 时随 \(i\) 减小而减小,可以均摊 \(O(1)\) 移动指针,那么剩下的问题一段是定值取max,可以预处理,另一段是形如一次函数取max,用李超树维护即可,打表发现李超树的移动是只增不减的,于是开 \(n\) 棵李超树暴力维护即可,复杂度均摊 \(O(n^2logn)\),相信李超树的小常数可以过。

还有 \(O(n^2)\) 的单调栈维护凸壳,不想写细节分讨。

T3:

可以简单倍增优化到 \(O(nlog^2n)\) 时间和 \(O(nlogn)\) 空间,树剖+前缀优化建图也可以做到相同级别复杂度,还有更厉害的单log做法,不过意义不大。

posted @ 2023-06-30 19:36  Displace  阅读(12)  评论(0)    收藏  举报