2023.6.14 NOI模拟赛总结

1.时间安排

7:10~9:30

T1:题目要求的是期望,但是观察样例都不太像取模后的分数的样子,感觉是诈骗的数据结构题。

T2:有标号有向点仙人掌(应该叫这个名字?)计数,目测需要生成函数,估计最多写个爆搜分。

T3:神秘DS,\(n^2\) 和数据随机是简单的,对于每个位置都要求答案估计正解是分治这类的。

观察+手摸样例发现最终一定会到达一个固定的局面,也就是求期望是在诈骗。

打了个倒推,如果当前还存在逆序对就不断修改,可以过掉 \(n=100\) 的大样例,分析下复杂度大概是 \(n^3\)

继续推,发现如果修改,一定是修改一段区间,并且这个区间前一段是 \(\lfloor\frac{sum}{len}\rfloor\),后一段是 \(\lceil\frac{sum}{len}\rceil\),这个位置需要满足 \(\lceil\frac{sum}{len}\rceil\) 要小于等于后一个数,写了个暴力找这个位置,复杂度 \(n^2\),可以过大样例。

一开始以为从这里开始就要DS了,分析一下需要区间赋值,求区间和,线段树上二分,都是简单的,写了个线段树,因为细节和取模问题调了一会,可以拍上。

9:30~10:20

写T3,觉得数据随机时删到一定程度本质不同的删除区间很少,如果某个时刻删除区间本质相同那么之后的操作是固定的,所以可以记忆化。

一开始写的 umap,自己随了一组跑了3s,觉得有戏,就改了手写 hash 表,0.6s 居然就跑完了,很厉害,就不管了。

10:20~10:40

觉得T1就算是 bit 的 log 也没法跑 1e7,就从 DS 上撤一步,继续推性质。

突然想到为什么能线段树上二分,仔细想想是因为后缀是递增的,而如果有 \(\frac{sum}{len}\leq x\),那么一定有 \(\frac{sum+x}{len+1}\leq x+\Delta\),所以是对的。

更进一步,考虑把符号换成大于号,此时如果有 \(\frac{sum}{len}> x\),一定有 \(\frac{sum+x}{len+1}\leq x\),但是加上常数是不对的。

于是根据这个,可以考虑维护后缀的若干相同颜色段,那么每次最多加入一个段,删除若干段,复杂度均摊线性。

写完轻松拍上。

10:40~12:00

本来以为可以写爆搜,发现自己不会判有向点仙人掌……

然后推推DP,试着从若干个链的合并入手,但是仙人掌形态太复杂,没推出来有价值的东西。

result:

T1:100 T2:/ T3:45

2.总结

T2:

从本质出发,首先要会有标号DAG的递推式:

这个式子的含义表示钦定 \(n\) 个点中的某 \(i\) 个是入度为0的点(因为是DAG,所以这样的点至少有1个),剩下的 \(n-i\) 个随意,这两个点集之间的边任意选,因为只能确定 \(i\) 个点的状态,所以需要容斥。

考虑把这个式子拓展,因为是有向点仙人掌,所以缩scc后还是个DAG,考虑把上面递推式的点换成环,先枚举点数,然后枚举这些点成的环数,再做上面的递推,系数是第一类斯特林数,如下:

含义与第一个式子完全一致。

注意到后面的生成函数相乘后还要乘上前面的系数,根据普通幂转上升幂的公式,有:

所以我们可以只保留 \(i=1\) 的生成函数卷积,手推一下发现系数是阶乘,指数是等差数列求和,具体如下:

然后就轻松 \(O(n)\) 了。

T3:

很神仙的题,没有想到前后缀最小值的东西。

操作是环很讨厌,我们可以考虑把最小值固定到 \(a_n\),这样如果操作到了边界1也不会回到末尾操作,最后暴力 \(O(n)\) 跑一下最小值所在位置的答案即可。

于是问题转化到了序列上,观察操作的本质,发现可以刻画为左边是若干后缀最小值,右边是若干后缀最大值,每次暴力比较两个相邻的最小值,取较大者然后把这一整段取走(这里先忽视奇偶性的细节),用归并可以做到元素个数线性,如果对所有元素都暴力做的话是 \(O(n^2)\) 的。

一种想法是数据结构加log,但是1e7的数据范围不得不线性,注意到单调栈的过程是线性的,考虑从这里入手。

考虑建出来笛卡尔数,每次找到区间最小值,左侧的一定会把右侧的全选走,右侧同理,可以加常数然后递归做下去,难点在于处理最小值所在位置。

观察发现最小值所在的区间内的后/前缀最小值实际上就是在处理单调栈时加入当前最小值弹出的若干元素,这些元素的个数和是 \(O(n)\) 的,所以做归并复杂度也是 \(O(n)\) 的,就可以线性做了。

posted @ 2023-06-14 19:14  Displace  阅读(13)  评论(0)    收藏  举报