2022.07.26 NOI模拟赛总结
1.时间安排
7:30~7:45
T1:正常的分块规则,给出m个区间,对每种块长求出一共需要计算多少次,可能是数据结构题,也许能想出来60分的 \(n\sqrt n\) 之类的做法。
T2:单点修改,全局查询所有连续K个数中最大+次大的最大值,只会20分暴力,有个40分n=1e4的档如果能去掉log就能做。
T3:数论题,有10分暴力DP,还有30分也许可以矩乘,剩下的n,m都是极大值级别的感觉不可做。
7:45~8:30
先开T2,写了20分暴力。
想了很久怎么去log,甚至口胡了一个可删除st表(误),又想了一堆奇怪的转化,比如定一个点求两侧最大值这类的,仍然规避不掉数据结构维护最大值的log,也不会四毛子rmq算法。
8:30~10:00
开T3,写了10分暴力。
显然可以矩乘,一组数据复杂度 \(O(n^4+n^3logm)\),上界卡死,但问题就在于T组数据(tnnd为什么又是T组数据)。
毕竟还没研究出 \(O(n^2)\) 的一般矩乘,这个矩阵也没啥特殊性,只能想办法转化成其他做法。
试着转成多项式,转化不出来。
10:00~12:30
先把T1的30分暴力写了。写的过程中发现这个东西显然整除分块。
打表发现需要支持区间加一个数,区间加等差数列(为什么全机房都是简单做法,就我推的是恶心的区间加等差数列???)。
这里整除分块是上取整,一开始图省事用二分找上界。(埋下伏笔)
一开始复杂度分析错了,区间加的过程直接分块,复杂度还是 \(n^2\) 的(一开始怀疑整除分块结论错误,自闭到11:00才发现这个sb错误)。(实际上加上图省事的二分是 \(n^2log\) /kk)。
后来发现直接用两个差分数组就能维护,可以线性修改,但是复杂度带了二分的log,极限数据跑不动。
没办法只能推O(1)找上界,调了很久很久,12:00多还是调出来了,实际上只需要把上取整转成下取整后上界+1即可,不知道自己迷在哪里了。
result:
T1:30 T2:20 T3:20
2.总结
T1:
因为linux比较文件比较麻烦,图省事输出文件加了换行,提交时忘了改回来……
(俯卧撑*10)
T1正解比较套路,没想到不应该。
感谢帆队的帮助,%%%帆队orz
第一点没想到:直接枚举块长 \(B\) 和每个块,复杂度是 \(O(nlogn)\)(调和极数)。
然后假设所有的询问区间都是需要暴力计算的,那么问题就变成了有多少区间可以用整块代替。
改变计算对象,就变成了当前块被多少询问区间完全覆盖,这些区间的代价都可从 \(B\) 变成1,直接乘算。
问题再一步转化,变成了如何求有多少区间左端点小于等于l,右端点大于等于r。两个取等不能同时满足。
用两个树状数组,分别维护左端点小于等于i的区间个数和右端点小于等于i的区间个数。
查询时容斥一下即可。
除了这个套路没想到,这题最亏的地方就是在图省事上,直接赔了两个多小时。
不能图省事啊……
T2:
又想了一堆奇怪的转化,比如定一个点求两侧最大值这类的
实际上直接单调栈就行了,每次重构,就能去掉log,不过J神实测常数太大过不去。
正解也比较套路。
可以把修改看做删去一个数,加入一个新数。
加入一个新数后的答案是容易用线段树维护的,支持区间最大值覆盖即可,但删除不好做。
那就不删除,直接按询问时间线段树分治。
这个做法时间复杂度 \(O(qlogqlogn)\) ,不过空间复杂度也是同样级别的,因为需要维护回撤操作,比较吃空间,需要注意vector的及时清空重构。
T3:
矩乘居然给了10分。
实际上30分只需要DP出来多项式后做循环卷积的快速幂,因为长度只有100暴力卷积就行,复杂度 \(O(Tn^2logm)\)
正解是离谱的生成函数,还需要pollard_rho,估计搞不出来。
(待upd?)

浙公网安备 33010602011771号