tenjiku

读题面

你可以在一个整数时刻,封锁一个点,在这一地点的每个人都将被逮捕,求一次性最多能逮捕多少人。

也就是说,我可以在任意整数时刻逮捕,有一些人有可能是“绕圈子”的,并不是第一次到这个点就被逮捕。

\(a_i\in [1,n]\),说明这个图是基环树森林。

\(k=0\)

考虑连通图的情况。显然集合点不可能在一个子树内,那个是因为往上走一点集合一定更优(时间加一即可),因此集合地点一定在环上。

考虑如果集合在 \(x\in cyc\),集合在 \(x\) 的话。计算出其他点 \(y\)\(x\) 的距离 \(d_y\)。因为我们到达了 \(x\) 可以一直在换上面转(设环长为 \(len\)),那么最大值就是 \(\max_{i=0}^{len-1}\sum [d_y\equiv i\bmod len]\)。枚举环上断的边(即枚举集合点)取最大值就可以了。

一个较优的操作

因为前面我们发现要对同余类个数取众数,所以自然而然认为如果用一步形成一个自环,这个连通块大小就可以加到答案里面了,后面步数也可以给答案加上其他连通块的大小,看起来很优。但是刚开始就做这个不一定是最优的,反例容易找到。

但是这个操作很有用。

\(k>0\)

如果直接考虑枚举每一步操作是啥,没有传递性(如果 \(k=c\) 最优的情况下再做一次最优的操作,不一定是 \(k=c+1\) 最优的操作)。那么每一个不同的 \(k\),只能独立看。

我蛮发现,如果前 \(k\) 步用了“一个较优的操作”,为了最大化答案,一定第一步就进行这个操作不劣。这个很好理解,我们每一次如果计算“连通块的大小”为答案,一定是选择 \(k\) 个大的进行 \(k-1\) 步连在一起,而最后要一次自环操作。因此这个时候答案就是前 \(k\) 大连通块大小之和。这个容易预处理得出。

否则的化,前 \(k\) 步没有用自环操作。每一次相当于挑选一个连通块粘到另一块上面,然后计算 \(k=0\) 的答案。现在要解决一个问题:怎么粘?

因为每一个块粘上去的时候有多种不同的方法,并且贡献给答案的都不同。但是其实我们可以把你选择的块直接分开:设粘到的目标连通块环长为 \(C\),那么对于联通块 \(a\) 粘上去的时候(设他现在是断开一条环边形成树,的最优状态),发现根据粘到环的哪儿,\(0\sim C-1\) 的距离都可以贡献到,因此可以调整模数。那么就变成了若干个独立的问题。

那么枚举 \(C\)。容易注意到,\(C\) 的不同取值只有 \(\mathcal{O}(\sqrt{n})\) 个(\(1+2+\cdots +\sqrt{n}\rightarrow n\)),可以直接枚举,如果可以 \(\mathcal{O}(n)\) 计算答案就可以。现在要快速解决的子问题是:

  • 对于一个连通块,做 \(k=0\) 的操作,但是求 \(\max_{i=0}^{len-1}\sum [d_y\equiv i\bmod C]\)

如果解决了这个子问题,对于 \(k\) 而言,取值前 \(k\) 大的连通块的值的和即可(这个最好桶排序避免 \(\log\) 的产生)。

所以关键是解决这个子问题,解决了时间复杂度就是 \(\mathcal{O}(n\sqrt{n})\)

子问题

可以暴力 \(\mathcal{O}(n^2)\) 求出,预期得分 \(45\)

考虑环上顺次的三个点 \(u,v,w\)。尝试求出断开 \(u\rightarrow v\) 变成 \(v\rightarrow w\) 的贡献变化。设环长 \(L\)

贡献变化如下:\(v\) 的子树内的点(包括 \(v\))距离减少 \(L-1\)(原来要绕一圈的,现在立马就到了),剩余的点的距离减少 \(1\)。因为余数平移一下没有答案改变,所以相当于一个子树内减少 \(L\),其他的不变。因为我们只会绕一圈求答案,所以暴力给子树改变距离是 \(\mathcal{O}(\sum siz)=\mathcal{O}(n)\) 的。

对于每一次变化,会使一个特定距离的出现次数减少或者增加一,而最大的出现次数就是要求的答案,所以答案每一次造作只会变动 \(1\),记录距离和距离出现次数即可。

posted @ 2025-04-05 16:12  SFlyer  阅读(23)  评论(0)    收藏  举报