20240918 模拟赛
A String
B Pack
看这个数据范围很容易想到 dp,设 \(f_{i,,j,k}\) (pair<int,int>)表示前 \(i\) 个物品,拿走 \(j\) 个 \(1\),\(k\) 个 \(2\) 所用的最少车数,以及最后一辆车所用的最少空间。转移分当前这个拿不拿掉讨论,非常显然。
最后枚举总共拿了几个 \(1\) 和几个 \(2\),如何算出所用的车数?注意到显然可以能放 \(2\) 就放 \(2\),不能放就放 \(1\),这样显然最优。dp 和统计答案都是 \(O(n^3)\) 的。可能会卡空间?滚动一下就好了。
C Weight
赛时爆搜拿了 70?
构造结论题。注意到每次 L 与 R 转换时显然放在对应位置上,不可能放到对面。如果前面的数放的太大了,后面转换时数可能会不够大。于是可以想到先在每个 L 或 R 的连续段开头从小到大放上前 \(k\) 大的数。剩下的位置从大到小正负交替放即可。
D 序列
考虑设置一个阈值 \(B\),出现次数小于 \(B\) 的数统一暴力做,这样的区间长度小于 \(2B\),所以时间复杂度\(O(nB)\)。
对于次数大于 \(B\) 的数 \(x\),设 \(b_i=[a_i=x]\),\(s_i\) 为 \(b_i\) 的前缀和,那么一个存在绝对众数的区间 \([i,j]\) 就满足 \(s_i-s_{j-1} > i-j+1-(s_i-s_{j-1})\)。移项即得 \(2s_i-i > 2s_{j-1}-(j-1)\),变成一个二维偏序问题。这就可以用树状数组计数了。这样的数 \(x\) 一定不超过 \(\frac{n}{B}\) 个,所以时间复杂度 \(O(\frac{n^2\log n}{B})\)。
最后计算出当 \(B=\sqrt{n\log n}\) 时复杂度最优 \(O(n\sqrt{n\log n})\)。但是这样常数较大,取 \(B=\sqrt n\) 就能通过。
标算是线段树,还有大神说可以线性。%%%