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?)

posted @ 2022-07-26 19:05  Displace  阅读(44)  评论(0)    收藏  举报