做题笔记20
10.18
给学弟的题单,Misty7、lsj2009、testib 别看了
模拟赛
T1
贪心
T2
分讨
T3
线段树
T4
不会
AT_abc288_h [ABC288Ex] A Nameless Counting Problem
把 \(M\) 加一,求
FWT,记 \(F_i=\frac{1}{1-xz^i}\)
当 \(|s\cap i|\equiv 1\bmod 2\),上式为 \(\frac{1}{1+x}\),否则,上式为 \(\frac{1}{1-x}\),记 \(cnt_s=\sum_{i=0}^{M-1}[|s\cap i|\equiv 1\bmod 2]\),那么原 GF 可以写出来
于是我们可以找到所有的 \(cnt_t\) 相同的 \(t\),这个可以数位 dp,后面那个生成函数是微分有限的,而且有一个简单的卷积式,于是可以快速计算,复杂度 \(\mathcal{O}(N^3\log X)\)
P3214 [HNOI2011] 卡农
和上面那题一样,不过 \(cnt_s\) 好算的多
P11459 [USACO24DEC] It's Mooin' Time P
关于牛叫个数有凸性,分治闵和,复杂度 \(\mathcal{O}(L^2n\log n)\)
P11458 [USACO24DEC] All Pairs Similarity P
对于所有的 \(S\),求
和
问题变成求形如
也就是求
考虑把 \([S\cup T=P]\) 拆了,也就是求
FWT,得到
当然也可以直接写出来这个很经典的容斥系数
所以原式
几遍高维前缀和,复杂度 \(\mathcal{O}(n2^n)\)
P11928 [PA 2025] 子序列 / Podciągi
数本质不同子序列个数减去只出现了一次的子序列个数,前者直接 dp
后者怎么办?考虑线段树合并的过程,记 \(f(a,b)\) 表示左端点字符为 \(a\),右端点字符为 \(b\) 的答案,什么时候合并会出锅呢,我们发现如果 \(a\) 那个位置和 \(b\) 那个位置中间还有一个 \(a\) 或者 \(b\) 就爆了,那可以记二进制数 \(s(x)\) 和 \(t(x)\),表示最后一个/第一个 \(x\) 右边/左边的字符集,如果 \(a,b\not\in s(x)\cup t(x)\) 就能转移了
所以转移是
可以分两步矩阵乘法转移
复杂度 \(\mathcal{O}(n\Sigma^3\log n)\)
P5828 边双连通图计数
设有根连通图的 EGF 是 \(D\),有根边双的 EGF 是 \(B\),则有
为啥是这样?要寻找 \(B\) 和 \(D\) 的关系,考虑枚举根所在边双的大小,对于每个点,他都能连若干个不相关的连通块,所以每条边的 EGF 就是 \(nD\),你再把这些边组合起来就是 \(\exp(nD)\) 了
拉反,记 \(H=x\exp D\),因为 \(D=B\circ H\),所以 \(B=D\circ H^{-1}\),求 \(D\circ H^{-1}\) 好办,我们有
P6596 How Many of Them
记 \(g_n\) 为 \(n\) 个点的无向连通图个数,这个可以 \(\mathcal{O}(n^2)\) 计算
考虑算钦定 \(k\) 个割边的方案,用一下 cayley 公式
直接算可以 \(\mathcal{O}(n^3)\),再二项式反演即可
AT_agc058_d [AGC058D] Yet Another ABC String
谁跟你容斥,可以战斗爽!设 \(8\) 个状态!
算了容斥更简单
容斥有多少不合法的段,去钦定不合法段的起点,设段数为 \(i\),则其他位置随便放的方案为
然后把这 \(i\) 个扔进去,每一个段前面的东西是有限制的,但是所有整个串的开头没有限制,就是
复杂度线性
10.19
P9334 [JOIST 2023] 水羊羹 2 / Mizuyokan 2
首先发现对于一个合法方案,我们可以把所有的小段都缩到只剩一个使得方案仍然合法,于是考虑每一个大段旁的两个位置,假如这个大段是 \([l,r]\),那么一定有 \(\text{sum}([l,r])>\max(a_{l-1},a_{r+1})\),这是一个方案的必要条件,对于所有小段长为 \(1\) 的方案,这显然也是充要的
如果我们能说明这对于所有小段长不为 \(1\) 的方案,也是充要的,那么我们就可以将问题转化为数能成为大段的最大段数,证明也是简单的,考虑两个段和 \([u,v]\) 和 \([x,y]\),记 \(s1\) 为第一段的和,\(s_2\) 为第二段的和,有 \(s_1>a_{v+1},s_2>a_{x-1}\),如果 \(a_{v+1}>a_{x-1}\),我们可以把 \(s_1\) 扩张到 \([u,x-2]\), 此时第一段的和肯定比 \(a_{v+1}\) 大了,否则我们可以扩另一段,与前一种情况类似
现在就变成了数最大段数,我们有经典的贪心做法,记 \(f(r)\) 为 \(r\) 为端点,最大的左端点 \(l\) 使得 \([l,r]\) 是一个合法的大段,那么可以从左往右扫一遍求答案
对于静态查询,我们记 \(nxt(r)\) 为最小的 \(k\) 满足 \(f(k)\ge r+2\),在 \(nxt\) 上一直跳就行了,但是不好维护单点修改
我们能说明 \(nxt(r)-r\) 是 \(\mathcal{O}(\log V)\) 的,因为 \(r-f(r)\) 是 \(\mathcal{O}(\log V)\) 的,因为你 \(f\) 每扩张一次,总和都至少乘二,所以最多扩张 \(\mathcal{O}(\log V)\) 次
那么单点修改可以直接暴力修,可以写一个 LCT 维护 \(nxt\),复杂度 \(\mathcal{O}(n\log \log V)\),但这样实在是太唐了!用线段树维护,维护每个区间左边 \(\log V\) 个点首次跳到区间外面的位置及段数,信息合并也是 \(\mathcal{O}(\log V)\) 的,所以总复杂度 \(\mathcal{O}(n\log^2V)\)
P10009 [集训队互测 2022] 线段树
对于 \(l=1,r=n\) 的询问,操作 \(k\) 次相当于卷上 \((1+x)^k\),此时对于 \(r\),\(l\) 对他有贡献当且仅当 \((r-l)\subseteq k\),考虑根号重构,取 \(k=2^{b}\),这样每次重构是 \(\mathcal{O}(n)\) 的,复杂度就可以做到 \(\mathcal{O}(q\sqrt n)\)
对于区间修改,考虑序列分块,我们发现在 \(B\) 次操作之内,每个点的权值之和其之前的 \(B\) 个数有关,于是我们把所有块及其前一个相邻块拉出来单独处理,对于整块修改可以直接打标记,散块修改可以暴力重构,这里需要做一个高维前缀和,所以复杂度是 \(\mathcal{O}(B\log B)\),查询时也暴力重构即可
如果操作次数 \(\ge B\),此时重构,从后往前扫描每个块更新 \(a_i\) 的值即可
于是总复杂度为 \(\mathcal{O}(\frac{q}{B}\frac{n}{B}B\log B+qB\log B)\),取 \(B=\sqrt n\) 即可,复杂度 \(\mathcal{O}(q\sqrt n\log n)\)
P11265 【模板】静态区间半群查询
猫树,从下面的分治中心往上扫,维护每个叶子到其当前中心的答案,这个可以并查集路压,但你合并的时候都是儿子并向父亲,所以这个可以看作按秩合并,复杂度就是 \(\mathcal{O}(n\alpha(n))-\mathcal{O}(1)\)
P9040 [PA 2021] Desant 2
有一个 bongbong dp \(f_{i}=\max(f_{i-1},f_{i-k}+\text{sum}(i-k+1,i))\),这样是 \(\mathcal{O}(nq)\) 的
这实际上是在做一个最长路,我们连边 \((x,x+1,0)\) 和 \((x,x+k,\text{sum}(x+1,x+k))\),我们发现一个点只连了两条边,于是可以考虑构造一个网格图,具体的,原来的 \(x\) 映射到网格图上 \((\left\lfloor\frac{x}{k}\right\rfloor,x\bmod k)\) 的位置,然后考虑分治,取出中间行或者中间列,然后向两边 dp 算出来最长路,对于跨过中间的询问直接更新出来,复杂度即为 \(T(n)=2T\left(\frac{n}{2}\right)+\mathcal{O}(n\sqrt n)=\mathcal{O}(n\sqrt n)\),需要注意的是在前几轮中可能会有一些斜着的边,这个也更新一下就行
CF2109F Penguin Steps
很生动的题目!
\(\text{dis}_M\) 和 \(\text{dis}_{F}\) 显然都有可二分性,考虑先二分出来 \(\text{dis}_M\),bfs 即可,现在考虑如何让 \(\text{dis}_{F}\) 更大,考虑二分这个值 \(k\),这时候我们要做的,就是 ban 掉一些格子,令他们的值为 \(k\),使得不存在 \((n,1)\) 到 \((r,n)\) 的路径,这显然是一个最小割!四联通图的最小割,可以转成跑八连通图的最短路,具体来说,建一个源点 \(s\) 和一个汇点 \(t\),然后 \(s\) 去连那些在 \((n,1)\) 和 \((r,n)\) 分割出来的两条边界的上面那条上的所有点,\(t\) 去连下面的点,跑 dij 即可
那如何使得 \(\text{dis}_{M}\) 还是合法的呢?直觉告诉我们可以找到一条最靠右上的 \((1,1)\) 到 \((r,n)\) 的路径,而且容易说明一定存在这样的路径,因为普通的图可能会出现先向右走,然后不得不提前向下走的一条路,以及一条先向下走一段,但是可以向右走很多的路,而在网格图中,这两条路必定相交,此时我们可以选择更靠右靠上的那一段!
那如何找到这条路?发现可以把 \((1,1\sim n)\) 以及 \((1\sim r,n)\) 这些点拉下来,然后跑 bfs,对于每一个点,如果其满足 \(a_{i,j}> \text{dis}_M\),这样会填满一部分区域,紧贴着这部分的就是我们要的路径!
复杂度 \(\mathcal{O}(n^2\log n\log V)\)
AT_agc016_f [AGC016F] Games on DAG
幽默
枚举 SG 值相同的层,从低到高不好转移,考虑从高到低转移,记 \(f_{S}\) 为当前的答案,枚举 \(T\subseteq S\),满足 \(1\) 和 \(2\) 同时在/不在 \(T\) 中,\(S\) 中的每个元素都至少向 \(T\) 中的某个元素连一条边,\(T\) 中的元素可以随便连 \(S\),\(T\) 中元素自己不能有边
容易做到 \(\mathcal{O}(n3^n)\)
AT_agc058_f [AGC058F] Authentic Tree DP
小廖半年前就说过这个神秘题,今天终于见识上了
思路没有,能想到的都是神人了
对于每条边 \((u,v)\),将其变成 \((u,p)\) 和 \((p,v)\),我们称 \(p\) 为边点,并在所有的 \(p\) 下面挂 \(P-1\) 个点,现在问题就变成了
对于新的图,给每个点确定一个权值 \(v\) 满足 \(v_i\) 互不相同,求所有边点的权值比邻居都小的概率
于是给所有边定向,大的连向小的
容斥,对于 \(p\rightarrow u\),钦定其反向,记 \(f_{u,i}\) 为 \(u\) 下面连了膜 \(P\) 意义下 \(i\) 个点,所生成的外向树的带容斥系数的概率,则有转移
- \(f_{u,i}\times f_{v,j}\times\frac{1}{j}\rightarrow f_{u,i+j}\)
- \(f_{u,i}\times\sum_{j}f_{v,j}\times \frac{1}{j}\rightarrow f_{u,i}\)
最后要转移 \(f_{u,i}\times \frac{1}{i}\rightarrow f_{u,i}\)
其中 \(\frac{1}{j}\) 是边点能作为外向树的根的概率,\(\frac{1}{i}\) 同理
复杂度 \(\mathcal{O}(n^2)\)
10.21
摆烂确实有点太多了,需要找回一些状态。
CF1279F New Year and Handle Change
wqs 二分
P4072 [SDOI2016] 征途
本质平方和,斜率优化/李超树
P4983 忘情
wqs 二分+斜率优化
P6246 [IOI 2000] 邮局 加强版 加强版
有决策单调性,再套个 wqs 二分即可
P4383 [八省联考 2018] 林克卡特树
记 \(f_{u,i,0/1/2}\) 为 \(u\) 在最终选出的那些直径上的形态,\(1\) 表示其为链端点,\(2\) 表示其为链顶,\(0\) 表示其不在链上,发现我们做的只有 \(\max,+\) 卷积和一些取 \(\max\),所以可以 wqs 二分把第二维搞掉
P10104 [GDKOI2023 提高组] 异或图
可以把第二维容了,于是先考虑解决子问题:
- \(\forall 1\le i\le n,0\le b_i\le a_i\)
- \(\bigoplus_{i=1}^{n}b_i=C\)
考虑在加一个数 \(a_{n+1}=C\),计算其异或和为 \(0\) 的答案,再计算 \(a_{n+1}=C-1\) 异或和为 \(0\) 的答案,两者做差即为异或和为 \(C\) 的答案,如果直接数位 dp,还是不好做,我们观察到一个事情,如果存在 \(a_i=2^k-1\),且其他的 \(a_j\) 都小于 \(a_i\),那么别的 \(a_j\) 无论取什么,\(a_i\) 都能取到一个合法的值,所以其贡献就是 \(\prod (a_j+1)\),所以我们在数位 dp 的时候,如果在某一个位上,有一个位置没顶到,比他低的位都可以随便算,于是考虑直接枚举这个位,记一个 \(dp_{i,0/1,0/1}\) 表示考虑了前 \(i\) 个 \(a\),目前是否有没顶到的数,异或和为多少,复杂度 \(\mathcal{O}(n\log V)\)
容第二维,我们在做集合划分,\(S\) 的容斥系数即为点集 \(S\) 所对应的所有连通子图的 \((-1)^{E}\) 之和,这个可以直接 \(\mathcal{O}(3^{n})\) 算,但是也可以令 \([x^S]F(x)=1\) 当且仅当 \(S\) 在原图上是独立集,那么容斥系数即为 \([x^S]\ln(F+1)\)
现在考虑 dp,我们直接 dp 的话需要记两维,这样状态数太爆了,而每个连通块的限制就是最小值的限制,于是考虑先给 \(a\) 排序,我们从前往后扫 ,如果 \(i\) 不在任何一个连通块中,给他确定一个连通块,其肯定为这个连通块的最小值,此时对于 \(1\sim i-1\),他们肯定都在某一个连通块中,所以状态里只需要记录他们是否为其连通块的最小值,对于 \(i\sim n\),需要记录他们是否已经在一个连通块内,这样状态数就只有 \(\mathcal{O}(2^n)\) 了,转移复杂度是 \(\mathcal{O}(n3^n)\)
总复杂度 \(\mathcal{O}((n\log V+m)2^n+n3^n)\)
P13758 【MX-X17-T7】夏终
大乱斗。
提出了一种很?的重构树方法,我也是被震撼
给出一种重构树的方法,其实叫重构链更合适,做 kruskal,每个连通块维护一个链表,连通块合并时将链表首尾相接,把这个链表拉下来建一个新的图,则我们可以说明,在原图上加入若干边后的 MST 的权值等于在新图上加入若干条边后的 MST 的权值,为啥呢?因为你做 kruskal 就保证了保留权值 \(\le w\) 的边后的连通性不变,那你权值就肯定相同了
所以我们把这张图变成了链,现在考虑加入新边怎么做,我们发现一定是取出 \(b\) 最小的点 \(x\),然后把不包含 \(x\) 的连续段中的 \(b\) 的最小值和 \(x\) 连边,这样连续段 \([l,r]\) 的代价就是 \(b_x+C+\min_{i=l}^{r} {b_i}+\sum_{i=l}^{r-1}w(i,i+1)\),不妨令 \(C'=C+b_x\),考虑一个 dp,记 \(f_{i,j,0/1}\) 为考虑了前 \(i\) 个点,有 \(j\) 个连续段,当前段已经算了代价/没算代价,则有转移
- \(f_{i,j,0}=\min(f_{i-1,j,0}+w_i,f_{i-1,j-1,1})\)
- \(f_{i,j,1}=\min(f_{i-1,j,1}+w_i,f_{i-1,j-1,1}+b_i,f_{i-1,j-1,0}+w_i+b_i)\)
答案为 \(\min(f_{n,i,1}+i\times C')\),你发现转移要么是取 \(\min\) 要么是 \(\min,+\) 卷积,于是可以往凸性上考虑,对于这样的连续段状 dp,凸性的说明也是简单的,可以直接拆点费用流
那对于两个凸壳,定义其乘法为 \(min,+\) 卷积,其加法为取 \(\min\),你发现上面的转移可以写成一个 \(2\times 2\) 的矩阵,于是可以考虑用线段树维护,直接线段树维护做单点修改是 \(\sum_{i}\frac{n}{2^i}=\mathcal{O}(n)\) 的,但是查询快的飞起,考虑平衡一下,直接上一个序列分块,修改复杂度 \(\mathcal{O}(B)\),查询怎么办,凸壳有加法还有乘法,正常的都是只有加法或者乘法,但是要处理这个也是简单的,考虑记 \(f(A)\) 为 \(A\) 这个凸壳对于 \(C'\) 的答案,即为 \(\min(A_i+i\times C')\),发现有 \(f(A+B)=\min(f(A),f(B))\),而 \(f(A\times B)=f(A)+f(B)\),于是我们可以对于每一块先查询出来四个凸壳的答案,然后再矩阵乘法合并起来,复杂度 \(\mathcal{O}(\frac{n}{B}\log B)\)
可以平衡到 \(\mathcal{O}(n\log n+q\sqrt{n\log n})\),可以直接过了,也可以离线基排,这样能做到 \(\mathcal{O}(n\log n+q\sqrt n)\),但是感觉常数不会小
#1004. 【UR #32】王之沉淀
太唐了。
既然是冒泡,考虑转 \(01\),枚举一个 \(w\),\(\le w\) 的看作 \(0\),否则看作 \(1\),答案显然就等于把所有 \(w\) 所对应的 \(01\) 序列排好序的轮数的最大值,直接考虑最后一步就行了,所以现在考虑 \(01\) 序列
对于 \(U\) 操作,我们发现其把第一个 \(1\) 挪到了最后,对于 \(D\) 操作,其把最后一个 \(0\) 挪到了最前面,这个零一序列拍好序了,当且仅当所有的位置,要么其左边全是 \(0\),要么右边全是 \(1\),所以我们发现一轮操作中只有 \(U\) 和 \(D\) 的个数是关键的,分别记为 \(C_U\) 和 \(C_D\),于是答案就是
其中 \(L_1\) 为 \(i\) 及左边 \(1\) 的个数,\(R_0\) 为 \(i\) 右边 \(0\) 的个数
那就豁然开朗了,枚举所有的 \(C_U\),扫描值域,维护一个指针 \(pos\),为最小的满足 \(\left\lceil\frac{R_0}{C_D}\right\rceil \le \left\lceil\frac{L_1}{C_U}\right\rceil\) 的位置,每次改变一个位置的 \(a\) 的值,\(pos\) 的总移动量是 \(\mathcal{O}(n)\) 的,总复杂度 \(\mathcal{O}(nk)\)
CF690A3 Collective Mindsets (hard)
太唐了,为啥我一直在想直接输出编号
考虑寻找一个不变量,不难发现所有数的和是不变的,如果我们能让某一个人猜到这个和膜 \(n\) 意义下的值,就能直接知道它对应的数是啥了,于是我们可以直接猜这个东西膜 \(n\) 意义下的值,对于编号为 \(r\) 的,猜这个东西是 \(r\bmod n\),这样至少会有一个对的
#950. 【UER #12】电子运动
这么强?!
考虑位置 \(i\),记他左边第一个 + 在 \(x\),右边第一个 - 在 \(y\),那么 \(i\) 走 \(i\rightarrow x\rightarrow y\rightarrow i\) 这条路的时候,对序列的影响仅仅是交换了 \(x\) 和 \(y\) 的符号,那么我们可以通过这种交换操作,使得整个序列左边全是 - 右边全是 +,那么整个序列只有 + 的个数和起点的位置是重要的
那分讨一下,对于起点 \(i\),如果有 \(\ge n-i+1\) 个 +,最终会减少 \(n-i\) 个 +,否则会增加 \(i\) 个 +
那么起点 \(i\),+ 数量为 \(j\) 的贡献就是 \((i+j)\bmod {(n+1)}\),直接卷积就行了,有那么一会我还觉得得写一个循环卷积,脑子真是越来越拉了
复杂度 \(\mathcal{O}(n\log n)\)
#937. 梅花侍从
当年被击败了
考察任意两组 \((a,b,c)\),用 \(0\) 和 \(1\) 来区分,我们可以发现最优的肯定是 \(000111\) 或者 \(110001\),于是可以直接当成括号做区间 dp,复杂度 \(\mathcal{O}(n^3)\)
#961. 【UR #30】赛场设计
把不可达性建图,由于原图是个 DAG,所以跟据不可达性建出来的图,对于每一个 \((u,v)\),要么有 \(u\) 不可达 \(v\),要么有 \(v\) 不可达 \(u\),要么 \(u,v\) 互相不可达,这是一个比竞赛图还要强的图,他也有竞赛图的性质,我们的要求是不存在大小 \(\ge 3\) 的 SCC,于是先缩掉大小为 \(2\) 的 SCC,剩下的图就是一张竞赛图,而且是一个 DAG,则需要满足不存在三元环,经典的,考虑其缩完了点是一条链,我们不妨让这条链正好就是 \(1\leftarrow2\leftarrow\cdots\leftarrow n\),考虑每次加入一个点或者两个点,最后再乘上 \(n!\)
记 \(f_{i,1/2}\) 为考虑了 \(i\) 个点,链尾点作为一个 SCC 的大小为 \(1/2\),以当前点 \(i+1\) 所在 SCC 大小为 \(1\) 举例,这时候每个之前的点都不能不可达 ,也就是必须可达 ,而之前的点也都满足 \(j\) 可达 \(j+1\),于是只有 \(i\) 必须要和 \(i+1\) 连一条边,而其他点是否连边无所谓,所以转移系数是 \(2^{i-1}\),转移 \(f_{i,1}\times 2^{i-1}\rightarrow f_{i+1,1}\),而如果链为大小为 \(2\),则他们俩肯定每没边相连,所以这俩点都必须向 \(i+1\) 连边,而其他点无所谓,所以转移系数为 \(2^{i-2}\),转移 \(f_{i,2}\times 2^{i-2}\rightarrow f_{i+1,1}\),当前点所在 SCC 大小为 \(2\) 的情况也类似,转移是 \(f_{i,2}\times 2^{2(i-2)}+f_{i,1}\times2^{2(i-1)}\rightarrow f_{i+2,2}\)
复杂度线性
10.22
模拟赛
T1
容
T2
轮廓线 dp,没调完
T3
题出的好!难度适中,覆盖知识点广,题目又着切合实际的背景,解法比较自然。给出题人点赞 !
T4
最优解是直径长度的一半,可以以直径中点为根构造内向树取得最优解,设这个值为 \(D\)
设一个势能函数 \(h(x)\),满足若存在有向边 \((x,y)\),有 \(h(x)=h(y)-1\),则有 \(d(s,t)=\frac{\text{dis}(s,t)+|h(x)-h(y)|}{2}\),最优解下,所有的叶子的势能肯定为 \(D\),所以不妨设 叶子的势能为 \(0\)
考虑合法方案的充要条件为 \(\forall x,y,\frac{\text{dis}(x,y)+|h(x)-h(y)|}{2}\le D\),即 \(|h(x)-h(y)|\le2\times D-\text{dist}(x,y)\)
对于任意一个 \(x\),在根的另一个子树中拿出来一个深度为 \(D\) 的叶子节点 \(y\),则有 \(|h(x)|\le D-dep_x\) 是方案合法的必要条件
证明充分性:\(|h(x)-h(y)|\le |h(x)|+|h(y)|\le D+D-dep_x-dep_y\le 2\times D-\text{dis}(x,y)\)
总结一下 \(h\) 满足的条件
- 对于所有深度为 \(D\) 的叶子节点,\(h=0\)
- 对于边 \((x,y)\),\(|h(x)-h(y)|=1\)
- \(\forall x,|h(x)|\le D-dep_x\)
此时合法的 \(h\) 与合法方案构成双射,直接 dp 可做到 \(\mathcal{O}(n^2)\)
题出的好!难度适中,覆盖知识点广,题目又着切合实际的背景,解法比较自然。给出题人点赞 !
AT_agc014_f [AGC014F] Strange Sorting
太难了
步数肯定是有限的,因为每次操作,至少会让某个最大值归位
考虑最大值没什么前途,所以考虑最小值,我们发现 \(1\) 完全不影响其他的数是否是 local max,于是可以考虑 \(i=n\sim 1\),每次加入一个数 \(i\),维护 \([i,n]\) 排好序的信息,记 \(T_i\) 为其轮数,那么要么有 \(T_i=T_{i+1}\),要么有 \(T_i=T_{i+1}+1\),为啥,因为 \(i+1\) 排好了的时候,要么是 \(1\) 正好放在最开头,此时取得 \(T_{i+1}\),否则 \(1\) 会放在中间,此时取得 \(T_{i+1}+1\)
有一个观察,就是 \(i+1\) 在第 \(T_{i+1}-1\) 轮的时候一定不在首位,如果其在首位,其一定会作为第 \(T_{i+1}-1\) 轮的高项,这时候它就会被调到后面,如果不想让他调到后面,需要所有位置都是高项,那这本身就排好序了,所以观察成立
于是现在考虑什么时候需要 \(+1\) 而什么时候不需要,因为 \(i+1\) 不可能在第 \(T_{i+1}-1\) 轮在首位,所以他不可能成为一个高项,那 \(i\) 同样不可能成为高项,所以在下一轮中 \(i\) 和 \(i+1\) 两个数的相对顺序不会改变,那肯定是让 \(i\) 在 \(i+1\) 之前,这样第 \(T_{i+1}\) 轮的时候 \(i+1\) 会被调到 \([i+1,n]\) 的首位,\(i\) 正好在他左边,所以我们可以说,\(T_i=T_{i+1}\),当且仅当 \(i\) 在 \(i+1\) 左边
既然首位不可能是 \(i+1\),我们可以考虑 \(T_{i+1}-1\) 时的首位 \(f_{i+1}\),那么 \(f_{i+1},i,i+1\) 三者在第 \(T_{i+1}-1\) 轮时,相对顺序是 \((f_{i+1},i,i+1)\) 的时候,\(T_i=T_{i+1}\)
接下来我们可以说明,\(f_{i+1},i,i+1\),三者的相对顺序的循环位移始终不变,这个结论是真的不自然
首先我们能够说明,在前 \(T_{i+1}-1\) 轮种,\(f_{i+1}\) 如果不是在开头,必然不会是一个高项,考虑反证法,如果 \(f_{i+1}\) 某一次作为了一个非开头的高项,那么考虑他前面第一个高项 \(x\),这一次操作之后,\(f_{i+1}\) 肯定和 \(x\) 紧挨着,考虑下一次操作,如果 \(f_{i+1}\) 和 \(x\) 都是高项或者都是低项,那么 \(f_{i+1}\) 就不会到首位,如果 \(f_{i+1}\) 是高项而 \(x\) 不是,在下一次操作之后 \(f_{i+1}\) 又变成了一个非开头的高项,这样就会无限递归,而我们的步数是有限的,\(f_{i+1}\) 就到不了首位,所以结论得证
然后考虑 \(f_{i+1},i,i+1\) 三者的相对顺序,如果其相对顺序发生了改变,肯定是在某一次操作的时候,形如 高低高 或者 低高低,下面分讨一下三者的位置关系
- \(i+1\) 是开头,\(f_{i+1}\) 和 \(i\) 一定是低
- \(f_{i+1}\) 是开头,\(i\) 和 \(i+1\) 一定是低
- \(i\) 是开头
- 如果 \(f_{i+1}\) 在第二个位置,\(f_{i+1}\) 和 \(i+1\) 都是低
- 如果 \(i+1\) 在第二个位置,\(i+1\) 可能是高,但 \(f_{i+1}\) 一定是低
- 否则 \(f_{i+1},i,i+1\) 都是低
所以结论得证,那我们只需要在每次加入 \(i\) 的时候看一下 \(f_{i+1},i,i+1\) 三者的相对顺序就行了,复杂度线性
AT_agc020_c [AGC020C] Median Sum
取补集,所以只需要求所有的 \(>\frac{s}{2}\) 的最小的,复杂度 \(\mathcal{O}(\frac{ns}{w})\)
CF963E Circles of Waiting
每行第一个为主元,高消即可

浙公网安备 33010602011771号