小题狂练 (G)

目录

\[\newcommand{\dep}{\operatorname{dep}}\newcommand{\lca}{\operatorname{lca}}\newcommand{\fa}{\operatorname{fa}} \]

[省选联考 2025] 推箱子

六国破灭,非兵不利,战不善,弊在赂秦。赂秦而力亏,破灭之道也。或曰:六国互丧,率赂秦耶?曰:不赂者以赂者丧,盖失强援,不能独完。故曰:弊在赂秦也。

秦以攻取之外,小则获邑,大则得城。较秦之所得,与战胜而得者,其实百倍;诸侯之所亡,与战败而亡者,其实亦百倍。则秦之所大欲,诸侯之所大患,固不在战矣。思厥先祖父,暴霜露,斩荆棘,以有尺寸之地。子孙视之不甚惜,举以予人,如弃草芥。今日割五城,明日割十城,然后得一夕安寝。起视四境,而秦兵又至矣。然则诸侯之地有限,暴秦之欲无厌,奉之弥繁,侵之愈急。故不战而强弱胜负已判矣。至于颠覆,理固宜然。古人云:“以地事秦,犹抱薪救火,薪不尽,火不灭。”此言得之。

齐人未尝赂秦,终继五国迁灭,何哉?与嬴而不助五国也。五国既丧,齐亦不免矣。燕赵之君,始有远略,能守其土,义不赂秦。是故燕虽小国而后亡,斯用兵之效也。至丹以荆卿为计,始速祸焉。赵尝五战于秦,二败而三胜。后秦击赵者再,李牧连却之。洎牧以谗诛,邯郸为郡,惜其用武而不终也。且燕赵处秦革灭殆尽之际,可谓智力孤危,战败而亡,诚不得已。向使三国各爱其地,齐人勿附于秦,刺客不行,良将犹在,则胜负之数,存亡之理,当与秦相较,或未易量。

呜呼!以赂秦之地,封天下之谋臣,以事秦之心,礼天下之奇才,并力西向,则吾恐秦人食之不得下咽也。悲夫!有如此之势,而为秦人积威之所劫,日削月割,以趋于亡。为国者无使为积威之所劫哉!

夫六国与秦皆诸侯,其势弱于秦,而犹有可以不赂而胜之之势。苟以天下之大,下而从六国破亡之故事,是又在六国下矣。

[省选联考 2025] 追忆

考虑询问的时候先求出 \(x\) 对应的 \(y\) 组成的 bitset \(U\),这就相当于一个 DAG 可达性按位与上一个 \(\{i\mid a_i\in[l,r]\}\),前者可以随意处理,后者可以随意分块处理 . 那么要求这样的点中 \(b\) 最大的,首先按 \(b\) 分块,找到在哪个块之后可以暴力扫整个块 . 比如处理出 \(B_x=\{i\mid b_i\ge x\sqrt n\}\),只需要找到最小的 \(p\) 使得 \(B_p\cap U=\varnothing\) 即可定位到块的位置 . 考虑扫一遍 \(U\) 的每个 word,维护一段前缀 word 对应的最小的 \(p\),单调指针即可(此处判有交只需要判一个 word 的长度,所以是 \(O(1)\) 的,不过这样就需要手写 bitset 了).

\(n,m,q\) 全部同阶,那么时间复杂度为 \(O(n^2/w+n^{1.5})\) .

QOJ #4420. Range Reachability Query

在询问上开 bitset,考虑处理出 \(f_{i,j}\) 表示 \(i\) 只经过 \([l_j,r_j]\) 内的点是否能到达 \(v_j\)\(g_{i,j}\) 表示 \(i\) 是否在 \([l_j,r_j]\) 内 . \(g\) 可以简单差分维护,\(f\) 转移的时候每次对边 \(i:(u,v)\)\(f_u\gets f_u\lor(f_v\land g_i)\) 即可 .

假设 \(n,m,q\) 同阶就是 \(O(n^2/w)\) 的 . 然而直接开空间会爆,还得改成分块 bitset .

QOJ #4417. Shallow Moon

我来玩儿原神了,考虑 \(y\) 轴按 \(w\) 分块,那么每个矩形可以分为 \(O(1)\) 段块上 \(y\) 轴方向的的前缀或者后缀,对于每个块可以扫描线拆出 \(O(n)\) 段关键区间然后并查集连边 .

这里如果把空块缩起来就是总共 \(O(n)\) 个关键区间(容易证明),总时间复杂度 \(O(n\log n)\)(排序).

[省选联考 2025] 岁月

先做 C 性质,这里只需要数有多少种定向方案存在外向生成树,那么相当于是缩点之后只有一个入度为 0 的点 . 考虑枚举这个点对应的集合 \(R\),然后算 \(R\) 能和外面连通的概率 .

贡献分为三个独立的部分:\(R\) 是强连通的,\(R\) 能到达 \(R\) 之外的所有点,\(R\) 之外的所有点都没有指向 \(R\) 内的边 . 第一部分可以通过调用主旋律解决 . 第二部分可以考虑经典的连通图计数容斥:\(f_S\) 表示 \(R\) 能到 \(S\) 内所有点的概率,转移的时候考虑计算所有不合法的方案,枚举集合 \(T\subset S\) 计算 \(R\) 只能到 \(T\) 内所有点的概率即可 . 第三部分平凡 .

然而对于每个 \(R\) 都要做一次连通图计数,复杂度太高 . 关于连通图计数的转移大概是这个样子:

\[f_S=1-\sum_{R\subseteq T\subset S}f_T2^{-e(S-T,T)} \]

其中 \(e(S,T)\) 表示 \(S-T\) 间的边数 . 由于每次初值都不一样,但是查询的位置都一样,于是可以把 DP 倒过来做,这样就只需要做一次了(具体就是看成 DAG 路径数什么的,也是经典套路了).

这样终于 \(\Theta(3^n)\) 解决了 C 性质 .

对于原题来说,按边权从小到大加入每条边,限制相当于是定向后的图的弱连通性和原图的弱连通性随时保持一致(可以考虑 Kruskal 的过程得到),那么每次只需要用新加入的边权合并若干个连通块即可 .

后面其实就和 C 性质差不多了,不过多了很多细节 . 大概就是对于每个 \(R\) 动态维护 \(R\) 最后是根的概率,每次合并贡献还是分为内部强连通、外部能到达所有点、外部所有点没有指回来的边,分别做一下就可以了 .

合并的时候只考虑有变化的连通块,那么时间复杂度相当于 \(\sum 3^{a_i}\text{ where }\sum a_i=n\),自然是 \(\Theta(3^n)\) 的 .

口胡还行,具体写起来感觉有点精神污染,真得想清楚了再写(

[ARC195E] Random Tree Distance

首先改成算 \(\mathbb E[\dep(u)]+\mathbb E[\dep(v)]-\mathbb E[\dep(\lca(u,v))]\),前面都是好算的,只需要算 LCA 的期望深度 .

\(u<v\),从 \(v\) 往上跳到第一个编号 \(\le u\) 的点的编号是 \(w\)(容易发现,\(w\) 在每个位置的概率分布是均匀的),则:

\[\mathbb E[\dep(\lca(u,v))]=\mathbb E(\dep(\lca(u,w)))=\dfrac1u\sum_{i=1}^u\mathbb E[\dep(\lca(u,i))] \]

可以发现这个式子和 \(v\) 是无关的,所以可以转写为计算 \(\mathbb E[\dep(\lca(u,v))]=\mathbb E[\dep(\lca(u,u+1))]\) .

关于 \(f_u=\mathbb E[\dep(\lca(u,u+1))]\),可以通过考虑 \(u+1\) 的父亲结点来计算:

\[f_u=\dfrac1u\left(\mathbb E[\dep(u)]+\sum_{i=1}^{u-1}\mathbb E[\dep(\lca(u,i))]\right)=\dfrac1u\left(\mathbb E[\dep(u)]+\sum_{i=1}^{u-1}f_i\right) \]

这样整个问题就可以被 \(\Theta(n+q)\) 解决了 .

[SNOI2020] 生成树

广义串并联图,对于每个 cluster,记 \((f,g)\) 表示连通 / 不连通的方案数,合并:

  • (删一度点)\(\operatorname{rake}((f_1,g_1),(f_2,g_2))\):实现上可以直接将 \(f_1\) 乘到答案上 .
  • (缩二度点)\(\operatorname{compress}((f_1,g_1),(f_2,g_2))=(f_1f_2,f_1g_2+f_2g_1)\) .
  • (叠合重边)\(\operatorname{twist}((f_1,g_1),(f_2,g_2))=(f_1g_2+f_2g_1,g_1g_2)\) .

这样就可以了,实现上可以学习一下高手写法 .

[省选联考 2025] 图排列

问题就是要给每个结点分配一个标号,使得任意两条没有公共点的边对应的标号组成的区间都不交 .

首先做树的情况,可以注意到每个点的每个子树内标号的集合都是不交的区间 . 那么就可以分治了:考虑 \(u\) 的子树,把 \(u\)\(u\) 每个子树内编号最小的结点一起排序,按顺序遍历每个元素,如果是子树就递归进入子问题,如果是 \(u\) 就加入答案序列末尾 . 这样就可以解决树的情况了 .

然后考虑森林的情况,显然每棵树对应答案序列的区间要么包含要么相离,也就相当于可以在做一棵树的时候进入另外一棵树,并且在这棵树做完之后返回原来处理的树 . 于是魔改一下树的情况就可以了 .

对于一般图来说,在圆方树上考虑就相当于在森林的基础上对于方点有额外的结点访问顺序限制 . 注意到如果原图有和 \(K_4\)\(K_{2,3}\)(杏仁)同胚的子图那么无解,于是原图的每个点双都一定形如一个环上面连若干条不相交的弦 . 容易发现这样的点双上唯一的遍历顺序就是沿环遍历一周(虽然方向可能是不确定的),找环可以简单通过使用广义串并联图方法解决 . 那么每个点上的遍历顺序都确定了,套用森林的处理方法即可 .

假设 \(n,m\) 同阶,时间复杂度为 \(\Theta(n\log n)\)(排序).

CF1656I Neighbour Ordering

通过一些讨论,可以得出有解当且仅当原图不存在与 \(K_4\)\(K_{2,3}\) 同胚的子图,这样的图被称为外平面 (outerplanar) 图 . 显然每个点双独立,而且只需要对每个点双构造出一条 Hamilton 回路即可简单完成构造 . 这是上一个题的一部分——使用广义串并联图方法即可,这里判断是否有解只需要判是否是广义串并联图和 Hamilton 回路是否合法 .

[ZJOI2022] 简单题

可能还真是个简单题?讨论可以知道原图中的点双必为杏仁,然后就随便用脚维护了(

[湖北省选模拟 2025] 团队协作 / team

首先通过一些技巧可以把问题改成这样:先固定所有独立集的权值为 \(n\),接下来减去只选权值 \(\le i\) 中的点的方案数 . 其实也就是只需要从小到大加入每种点权(或者反过来删点),然后动态维护包含每个点的独立集的权值历史和 .

可以考虑在静态 Top Tree 上维护,维护包含每个点的独立集的信息可以直接打懒标记 .

反正我是看不懂我以前写的静态 Top Tree 了,拼尽全力无法写出代码(

[AGC068A] Circular Distance

首先考虑枚举 \(d\) 算最大距离 \(\le d\) 的方案数 . 接下来不妨认为必选 \(0\),算完后答案乘 \(\frac Ln\) 即可 .

注意到选 \(0\) 之后立刻会导致编号在 \([d+1,L-d-1]\) 内的点都无法被选中,或者说只能选中 \([1,d]\)\([L-d,L]\) 内的点 . 这两部分内部肯定不会产生矛盾,所以只需要考虑两个区间间互相的限制 .

比如选左边的点 \(x\),会使得 \([x+d+1,x+L-d-1]\) 内的点无法选中 . 注意到区间长度 \(l=L-d-2\) 是一定的,如果将 \(x\) 平移到 \(x+d+1\),就相当于 \([x,x+l]\) 内的点无法选中 .

那么问题可以转为在 \(d\) 个点中选 \(n-1\) 个黑点,要求黑色和后面的白色点之间至少相隔 \(l\) . 考虑枚举黑白交替了多少次,然后先分配黑 - 白模式再插入剩余颜色,这可以简单使用组合数算出 .

根据调和级数可得时间复杂度为 \(\Theta(L\log L)\),可以通过 .

[CEOI 2020] 象棋世界

首先 pawn, rook, queen 的情况就随便分讨一下就可以了 .

对于 bishop 来说,考虑枚举第一步走的方向,接下来每次走斜线走到边界,直到最后一步使得行号大于行数且列号对齐 . 这之后就是要把多余走的行数减去,这里可以通过在每个转角少走两步来使得最终到达的行号减二,那么方案数插板一下就可以算了(这里需要写 \(\Theta(m)\) 的求组合数 \(\binom nm\)).

对于 king 来说,只需要算每次走 \((1,-1),(1,0),(1,1)\) 中的一个,且随时不越过边界的方案数 . 根据反射容斥可以转为计算 \([x^q](x^p-x^{-p})(x+1+x^{-1})^{m-1}\pmod{x^{2n+2}-1}\) 状物 .

核心部分就是计算 \((x+1+x^{-1})^{m-1}\bmod(x^{2n+2}-1)\),其实大概也只能 \(\Theta(\mathsf M(m)\log n)\) 了 .

CF1239E Turtle

调整可证答案取的最优路径一定选满一行,那么把两个角落放上最小的两个数就是要把剩下的数分配到两个相等的集合,使得它们的和最接近 .

手法一下就可以 \(\Theta(n^{1.5}\sum a/w)\) 背包求出来了(

CF613E Puzzle Lover

答案一定形如两个 U 型接口中间接一段左右方向只往一边走的路径:

可以先 Hash 出左边 U 型的方案数,然后在其基础上 DP 出带中间路径的方案数,然后右边在 Hash 算出可能的长度拼上即可 . 时间复杂度 \(\Theta(nk)\),实现细节比较复杂 .

CF1466H Finding satisfactory solutions

可以认为条件是这样的:对于每个子集内部的人,在交换后不会使得每个人的选择都不变劣 .

题目指出,对于一组喜好排列簇 \(\{a\}\),合法的分配排列 \(p\) 只有一种 . 考虑如何找出唯一合法的 \(p\) . 构造一张有向图,首先每个点连它最喜欢的物品,这样会得到一个基环树森林 . 注意到环上每个点都是最优决策,不可能改(否则会引起环上点组成的子集的矛盾),那么可以把环删掉,环外连到环上的点转而连剩余位置最喜欢的物品 . 不断进行这样的操作,最后会得到若干个环,这就指出了唯一合法的 \(p\) .

那么可以把问题转写为如下问题:

给定长度为 \(n\) 的排列 \(p\) . 对于排列簇 \(\{a\}\),如下构造 \(n\) 个点的有向图 \(G\)

  • 如果 \(j\)\(a_i\) 中比 \(p_i\) 靠前,连黑边 \(i\to j\) .
  • 连白边 \(i\to p_i\) .

一张有向图 \(G\) 合法,当且仅当其所有环都是纯白的 . 问有多少种排列簇使得其构造出的有向图合法 .

限制是因为这里只有纯白的环才不会导出对应子集的矛盾 .

可以考虑首先把白边连上然后缩点,这样会产生一系列新的点,需要在这些点上连出一个 DAG .

首先,如果 \(i\) 连了 \(d_i\) 条黑色出边,则整个 DAG 对应的排列簇个数即为 \(\prod d_i!(n-d_i-1)!\)\(p_i\) 上下都随便排).

接下来调用主旋律,\(f_S\) 表示点集 \(S\) 连出的 DAG 对应的权值和,则:

\[f_S=\sum_{T\subset S}(-1)^{|S-T|-1}f_T\cdot w(T,S-T) \]

其中 \(w(S,T)\)\(T\to S\) 连边的权值和 . 关于 \(w\) 具体是什么:由于 \(T\) 中每个点都是独立的,所以可以先算一个点的方案数然后 \(|T|\) 次方,一个点的方案数只和 \(S\) 的大小相关:

\[w(s)=\sum_{i=0}^n\dbinom sii!(n-i-1)!=\dfrac{n!}{n-s} \]

这里状态只和每种大小的点的出现次数有关,那么状态数 \(S(n)\) 大概是一个 \(\prod(c_i+1)\text{ where }\sum i\cdot c_i=n\) 这种问题,此处 \(S(40)=1440\)A088881),所以压一下状态就可以跑了 . 时间复杂度 \(\Theta(nS(n)^2)\) .

CF582D Number of Binominal Coefficients

根据 Kummer 定理,\(\nu_p(\binom{n+m}m)\) 就是 \(p\) 进制下计算 \(n+m\) 的进位次数 .

然后问题就变成数 \(n,m\) 使得 \(n+m\le A\)\(p\) 进制下 \(n+m\) 的进位次数 \(\ge\alpha\) . 做一个巨大的数位 DP 就可以了 .

[AGC020E] Encoding Subsets

首先朴素 DP 很简单:每次转移到字符串的前 / 后缀,或者若干 period 位置的子串的 AND . 然后感受那股劲,状态数不是很多,直接就过了(

awdawdawdawd证明不会

[AGC028D] Chords

一个连通块可以唯一地由其中编号最小的点和编号最大的点表达,考虑令 \(f_{i,j}\) 表示 \(i,j\) 作为连通块中编号最小 / 大的点的方案数 . 如果 \([i,j]\) 内的点初始不向外部连边,则:

\[f_{i,j}=(c(i,j)-1)!!-\sum_{k=i}^{j-1}f_{i,k}\cdot(c(k+1,j)-1)!! \]

其中 \(c(i,j)\)\([i,j]\) 内部连边方案未确定的点的个数 .

具体就是考虑连通图计数容斥:枚举 \(i\) 所在连通块中编号最大的结点编号,然后一侧递归进入子问题、一侧随便连 .

算出 DP 数组之后,答案可以由 \(\sum_{i,j}f_{i,j}\cdot(n-2k-c(i,j)-1)!!\) 计算 . 总时间复杂度 \(\Theta(n^3)\) .

Fun Fact:如果你检索了 \(k=0\) 时的答案,可能会发现它是 A111797(i.e. 存在一个前缀是排列的不含不动点的对合个数)的移位 . 这个事实由上述 DP 是显然的,但是这两个问题间直接的双射关系却似乎并不是很显然 .

CF1342F Make It Ascending

相当于把若干集合浓缩到一个集合内元素的位置上,那么首先有朴素 DP:\(f_{S,i,j}\) 表示选了 \(S\) 集合内的元素、最后一个集合选在 \(i\) 位置且和为 \(j\) 的最多集合个数 . 这里 \(f\) 的值域是 \(O(n)\) 的,于是可以考虑交换值域和 \(j\) 这一维 .

时间复杂度 \(O(n^23^n)\),由于某些奥妙重重的原因可以通过 .

[AGC022F] Checkers

首先可以简单转写为这样的问题:考虑每个点度数都是 0 或 2 的二叉树 . 根的点权是 \(1\),每往左子树走一步乘 \(-1\)、往右子树走一步乘 \(2\) . 如果叶子中每个点权的出现次数是 \(c_i\),那么它的权值是 \(\frac{(\sum c_i)!}{\prod c_i!}\) . 问所有 \(n\) 个叶子的这样的二叉树可以构成的每种叶子点权集合的权值之和 .

首先可以先把 \(n!\) 提出来,算 \(\frac1{\prod c_i!}\) 之和 . 按点权有多少个因子 2 分层,令 \(f_{i,j,x,y}\) 表示已经考虑过 \(<i\) 层的所有点、总共有 \(j\) 个叶子、第 \(i\) 层叶子的点权中有 \(x\) 个正数 + \(y\) 个负数的答案 . 每次转移的时候枚举 \(a\) 个正数度数为 2 + \(b\) 个负数度数为 2,算一下第 \(i\) 层和第 \(i+1\) 层的情况,并且把第 \(i\) 层的贡献累积上即可 .

直接写即可 \(\Theta(n^6)\)(也能过). 进一步可以发现 \(i\) 并没有什么用,删掉就是 \(\Theta(n^5)\) 了 .

UOJ #312. 梦中的题面

我爱玩儿原神啦啦啦,首先可以随便拿 GF 或者容斥推出答案的一个表达式:

\[\mathrm{ans}=\sum_{S\subseteq[1,m]\cap\Z}(-1)^{|S|}\dbinom{n-\sum_{i\in S}(b^i-c+1)+m-1}m \]

考虑依次加入 \(1\dots m\),每次合并可以用 Vandermonde 卷积转移 . 然而这里还需要强制限制一下上指标非负,如果记 \(a_i=b^i-c+1\) 那么有 \(a_i>\sum_{j<i}a_j\),于是可以把 \(n\) 拆解到各个 \(a_i\) 的维度上进行变进制数位 DP 状物 .

\(m,b,\log n\) 同阶,时间复杂度为 \(\Theta(\mathsf M(m)m^2)\)(实现上那个拆变进制怎么暴力怎么来就行,反正不是瓶颈).

UOJ #607. 跳蚤电话

倒过来看整个过程,就是问用 rake / compress 收缩整棵树的方案数 .

这里用概率方便一些:记 \(f_u\) 表示假定 \(u\) 点有一个父亲,只能操作子树内的点,随机排列删完子树 \(u\) 的概率 . 每次转移的时候最后删的点 \(v\),给 \(u-v\) 上的路径用 compress,路径上挂的子树递归进入子问题 . 这里直接实现的时间复杂度是平方的,不过用一点简单的优化就可以线性了(或者多一个求逆元的 log).

UOJ #181. 密码锁

首先因为是竞赛图所以强连通分量个数就是点集 \(S\) 的个数,要求 \(S\)\(U-S\) 间的边起点都在 \(S\) 内 .

考虑先把所有边都当成 \(\frac12\) 算,特殊边再额外乘 \(2p_i\)\(2(1-p_i)\) . 连通块间独立,对于每个连通块枚举在 \(S\) 内的点都是什么,连通块间卷积合并即可 . 时间复杂度 \(\Theta(n2^m+n^{2\sim 3})\),后面 \(n\) 的指数取决于实现方式 .

UOJ #370. 滑稽树上滑稽果

首先有朴素 DP:\(f_S\) 表示开局从 \(S\) 开始的答案,每次往开头放一个数,转移 \(f_S=\min\limits_i\{f_{S\land a_i}+(S\land a_i)\}\) .

考虑转移的时候枚举 \(S\land a_i=T\subseteq S\),只需要判断每个 \(T\) 是否合法 . 可以考虑弱化到 \(a_i\land(S-T)=0\),不满足 \(S\land a_i=T\) 的转移点一定不优 . 这个限制可以通过转为 \(a_i\subseteq\lnot(S-T)\) 后高维前缀和简单处理 .

\(n,A\) 同阶,那么算法的时间复杂度为 \(O(n^{\log_23})\)(枚举子集).

[NOI2023] 贸易

在 LCA \(l=\lca(u,v)\) 处统计贡献,只需要分别算 \(u\to l\)\(l\to v\) 的贡献即可 . 前者是平凡的,后者可以把 \(l\) 的子树和根链提取出来跑 Dijkstra,总点数是对的 . 然而由于根链的均摊并不是那么对所以加第二类道路的时候需要手法一下,只加起点在子树内的边,这样边数才对 .

\(2^n,m\) 同阶,时间复杂度为 \(\Theta(n^22^n)\) .

[USACO24DEC] All Pairs Similarity P

首先使用 \(|A\cap B|=|A|+|B|-|A\cup B|\) 将问题转为计算若干个

\[\begin{aligned}f_x&=\sum_y\dfrac{c_y}{|x\cup y|}\\&=\sum_y\sum_S[x\cup y=S]\cdot \dfrac{c_y}{|S|}\\&=\sum_yc_y\sum_T[x\cup y\subseteq T]\sum_{S\supseteq T}(-1)^{|S|-|T|}\dfrac1{|S|}\\&=\sum_{T\supseteq x}\bigg(\sum_{y\subseteq T}c_y\bigg)\bigg(\sum_{S\supseteq T}(-1)^{|S|-|T|}\dfrac1{|S|}\bigg)\end{aligned} \]

然后用几下高维前缀和就随手维护了 . 时间复杂度 \(\Theta(n+k2^k)\) .(注:2025.4.13 闲话

[JOISC 2022] 鱼 2

首先可以考虑每条鱼最多吃掉哪些鱼,这构成一个区间 \([l,r]\) . 那么就相当于如果一个区间和询问区间有交那么它内部的点就都不能选,问询问区间内能选的点数 .

在线段树上维护,合并的时候只需要关心有那些位置原来有交现在没交了,这样的区间一定跨过中点且个数不超过 \(O(\log V)\),可以直接大力维护 . 时间复杂度 \(O((n+q\log n)\log V)\) .

这个题的性质非常良好,例如找区间的时候左右跳的切换次数是 \(O(\log V)\)、区间要么包含要么不交、区间的嵌套层数是 \(O(\log V)\) 等等,于是就呈现出一种随便怎么做一下都能过的感觉(

[ZJOI2022] 众数

首先答案就是区间内众数出现次数加区间外众数出现次数,贡献算区间外的 . 考虑对元素出现次数根号分治,称出现次数 \(>\sqrt n\) 的数为大数,否则为小数 . 首先大数对其它位置的贡献是简单的:枚举每个大数 \(x\),处理出 \([a_i=x]\) 的前缀和,再枚举另外一个数计算最大子段和即可 .

那么只有小数对小数的贡献还没有解决,考虑直接枚举左右端点是什么(可以调整到端点和区间外众数一致),接下来只需要计算区间众数 . 由于小数的出现次数 \(\le\sqrt n\),可以处理出对于每个左端点、众数出现 \(1\dots\sqrt n\) 次的最小右端点,然后单调指针即可求出区间众数 .

另外对于区间包含序列边界的情况需要特殊处理一下 . 时间复杂度 \(\Theta(n\sqrt n)\) .

[WC/CTS2024] 线段树

注意到:知道结点 \([l,r)\) 的值则连边 \(l-r\),最后如果 \(L,R\) 连通则知道 \([L,R)\) 区间的和 .

那么可以在建出来的图上考虑 . 容易发现左端点所在连通块的每个结点一定都在右端点所在连通块左边,令 \(f_{u,i}\) 表示考虑 \(u\) 的子树、\(u\) 左端点所在连通块的右端点为 \(i\)\(i\) 小于 \(u\) 的右端点)的方案数,\(g_u\) 表示考虑 \(u\) 的子树两端点连通的方案数 . 可以简单写出三类转移(\(l,r\)\(u\) 的左右儿子):

  • \(g_u\overset+\gets2\cdot g_l\cdot g_r\) .
  • \(g_u\overset+\gets g_l\cdot f_{r,i}+f_{l,i}\cdot g_r\)\(f_{u,i}\overset+\gets g_l\cdot f_{r,i}+f_{l,i}\cdot g_r\) .
  • \(g_u\overset+\gets f_{l,i}\cdot f_{r,j}\)\(f_{u,i}\overset+\gets f_{l,i}\cdot g_{r,j}\) .

这里第三类转移中 \((i,j]\) 部分会与 \(u\) 的左右端点都不连通从而独立出来 . 那么需要保证所有询问区间 \([L,R)\) 的端点要么都在其中、要么都不在其中 . 可以考虑使用 XOR Hashing 求出每个位置覆盖的区间集合对应的等价类,那么限制相当于 \(i,j\) 在同一个等价类中 . 于是可以把转移的第二维改为等价类:

\[\begin{aligned}&g_u=2\cdot g_l\cdot g_r+g_l\sum_if_{r,i}+g_r\sum_if_{l,i}+\sum_if_{l,i}\cdot f_{r,i}\\&f_{u,i}=f_{l,i}\cdot g_r+g_l\cdot f_{r,i}+f_{l,i}\cdot f_{r,i}\end{aligned} \]

可以使用线段树合并维护,时间复杂度 \(O(n\log n)\) .

[ARC068F] Solitaire

原神,由于 xrlong 的题解是公开的所以就不复读了(

[NOI2024] 树形图

首先有一些基本的观察:如果不存在 1 类点,那么就是缩点之后唯一的入度为 0 的 SCC 内的点是 2 类点,其它均为三类 . 以 1 类点为根的 DFS 树没有横叉边 .

找出一个 1 类点

考虑一个剥叶子的过程:首先由于以 1 类点为根的 DFS 树没有横叉边,所以叶子的入度一定为 1 . 动态维护入度为 1 的点,每次找出一个这样的点 \(u\),假设有边 \(v\to u\),则将这条边缩掉(去掉自环,不去掉重边). 最后如果能得到孤立点则这个点就是 1 类点,否则不存在 1 类点 . 实现上可以通过启发式合并边集完成这个流程 .

由一个 1 类点找出所有 1 类点

考虑以这个 1 类点为根的 DFS 树:

  • 如果有 \(\ge2\) 条返祖边覆盖边 \(\fa(u)\to u\),则 \(u\) 一定不是 1 类点 .
  • 如果有恰一条返祖边 \(x\to y\) 覆盖边 \(\fa(u)\to u\),则 \(u\) 是 1 类点当且仅当 \(y\) 是 1 类点 .

于是可以自顶向下递推出所有 1 类点 .

由一个 1 类点找出所有 2 类点

首先求出所有 1 类点对应的返祖边,这些返祖边是不能删去的 . 问题即为是否可以删去一些其它返祖边使得某个点被一条返祖边 \(x\to y\) 覆盖,且 \(y\) 是 1 / 2 类点 .

类似地,考虑以这个 1 类点为根的 DFS 树:

  • 如果有 \(\ge2\) 条不能删去的返祖边覆盖边 \(\fa(u)\to u\),则 \(u\) 是 3 类点 .
  • 如果有恰一条不能删去的返祖边 \(x\to y\) 覆盖边 \(\fa(u)\to u\),则 \(u\) 是 2 类点 .
  • 如果有零条不能删去的返祖边覆盖边 \(\fa(u)\to u\),则 \(u\) 是 1 类点当且仅当存在一条返祖边 \(x\to y\) 覆盖 \(\fa(u)\to u\),且 \(y\) 是 1 / 2 类点 .

于是可以自顶向下递推出所有 2 类点 .

综上所述,整个问题被 \(O(n\log n)\) 解决(\(n,m\) 同阶).

CF538H Summer Dichotomy

首先有显然的扫描线做法……但是粉兔的做法实在是太短了

首先如果三个老师的区间两两不交那么显然无解,否则取两部分的人数分别为 \(n_1=\min r_i,\,n_2=\max l_i\),这样只需要调整 \(n_1,n_2\) 使得 \(t\le n_1+n_2\le T\) .

然而讨论可以发现 \(n_1\) 只能减小、\(n_2\) 只能增大,那么可以确定一组最优的 \(n_1,n_2\),接下来只需要做一下二分图染色判定就可以了 . 时间复杂度 \(O(n+m)\) .

[USACO24FEB] Infinite Adventure P

首先有一个基本的倍增的思路,考虑记每个位置 \(i\)、日期 \(\bmod T_i=j\)、走 \(2^k\) 步的答案,然而这种情况当走到 \(T_j>T_i\) 的位置时信息会不够 . 这样的情况只发生 \(O(\log V)\) 次,可以考虑转而记能走 \(2^k\) 步、走到 \(T_j>T_i\) 的位置就停止所走到的位置和步数,倍增做每一次切换中间的操作就可以了 .

这样预处理是 \(O(n\log^2V\log T)\) 的有点爆炸 . 问题在于如果走到 \(T_j<T_i\) 的位置时会丢失信息,所以转而记经过 \(2^k\)\(T_j=T_i\) 的位置所走到的位置和步数,这样就可以了 . 时间复杂度 \(O(n\log T+q\log V\log T)\) .

[LNOI2022] 盒

首先考虑给定 \(a,b\) 怎么算 \(\mathrm{val}\) . 把贡献分摊到每一条边上,令 \(c,d\)\(a,b\) 的前缀和,则:

\[\mathrm{val}=\sum_{i=1}^{n-1}w_i|c_i-d_i| \]

显然每位独立,考虑枚举每个 \(d_i\) 是什么算贡献,则可以得到答案的一个表达式(\(m\) 是题目里的 \(S\)):

\[\mathrm{ans}=\sum_{i=1}^{n-1}w_i\sum_{j=0}^m|j-c_i|\dbinom{i+j-1}{i-1}\dbinom{n-i+m-j-1}{n-i-1} \]

那么就只需要算若干组

\[\begin{aligned}&f(n,m,i,k)=\sum_{j=0}^k\dbinom{i+j-1}{i-1}\dbinom{n-i+m-j-1}{n-i-1}\\&g(n,m,i,k)=\sum_{j=0}^kj\dbinom{i+j-1}{i-1}\dbinom{n-i+m-j-1}{n-i-1}\end{aligned} \]

其中 \(n,m\) 固定,\(i,k\) 两维都单调不降 .

首先 \(g\) 可以把 \(j\) 吸收进去改成 \(f\)\(g(n,m,i,k)=i\cdot f(n+1,m-1,i+1,k-1)\) . 所以只需要解决 \(f\) . 由于两维都单调不降可以想一下每次移动指针 . 移动 \(k\) 是显然的,移动 \(i\) 可以用一下那个范德蒙德卷积做一半

\[f(n,m,i,k)=\sum_{j=i+1}^n\dbinom{j+k-1}{j-1}\dbinom{n-j+m-k-1}{n-j} \]

这样整个问题就被 \(\Theta(n+m)\) 解决了(CF1615F 那个题大概也可以拿类似的东西优化到线性).

CF1975H 378QAQ and Core

首先取出字符串中最大的字符 \(c\),调整可证答案一定形如 \(cs_1cs_2c\cdots cs_kc\) . 如果能求出 \(s_{1\dots k}\) 则可以把每个 \(cs_{1\dots k}\) 看成一个字符递归进入子问题 .

\(n-k<k\),直接轮流给每个 \(s\) 分配 \(c\),最后剩下 \(k\bmod (n-k)\)\(c\) 递归进入即可 .

否则每个 \(s\) 的开头一定是字符集中字典序最小的 \(k\) 个,每次填完一轮后淘汰一定不优的后缀,直到填完即可 .

类似 Euclid 算法地分析可知时间复杂度为 \(O(n\log n)\) .

[NOI2017] 整数

Big integers with negative digits: The Trygub numbers .

posted @ 2025-04-24 20:53  yspm  阅读(73)  评论(1)    收藏  举报
😅​