小题狂练 (F)

目录

\[\newcommand{\size}{\operatorname{size}}\newcommand{\subtree}{\operatorname{subtree}}\newcommand{\fa}{\operatorname{fa}}\newcommand{\dist}{\operatorname{dist}}\newcommand{\mex}{\operatorname{mex}}\newcommand{\lowbit}{\operatorname{lowbit}}\newcommand{\popcount}{\operatorname{popcount}} \]

[CSP-S 2024] 擂台游戏

首先令点数一定,否则可以枚举点数,时间复杂度不变 . 考虑按编号顺序依次加入每个结点 .

问题大概是这样一个形态:某个结点从某个时刻开始可能获胜,后来被兄弟爆了导致不可能获胜 . 可以通过求出每个子树答案确定的时刻和确定的答案来求解每个结点能获胜的时间区间 .

时间复杂度 \(\Theta(n+m)\),详细解释看 wosile 的题解 .

边三连通分量

边三连通分量:洛谷 P6658 / QOJ #1000(然而好像都是搬的 Library Checker).

对于每个连通块分别处理,建 DFS 树并找出割边和切边等价 . 割边直接割掉,对于一组切边等价 \(e_1\sim e_2\)

  • 切边等价的两条边都不在 DFS 树上:然而显然这是不可能的(因为 DFS 树已经连通点集了) .
  • 切边等价 \((u,\fa(u))\sim e\) 恰有一条边在 DFS 树上:对 \(u\) 的子树内异或上随机权值 .
  • 切边等价 \((u,\fa(u))\sim(v,\fa(v))\) 的两条边都在 DFS 树上:将以 \(u,v\) 为界点的极大 cluster 异或上随机权值(可以转为若干次子树异或).

对于每个切边等价类对每对相邻的两条边做上述操作,此后容易发现权值相同的点在同一个边三连通分量内 .

时间复杂度 \(O(n+m)\) .

[Ynoi Easy Round 2025] TEST_34

区间修改区间线性基,用 zak 的新做法做:每次以 \(\frac12\) 概率随机选取序列中的元素得到 \(\Theta(\log qV)\) 个序列,询问时在这些序列上查区间异或和,用这些异或和构造线性基 . 时间复杂度 \(O((n+q\log nV)\log qV)\) .

正确性:只需要考虑线性基能表示 \([0,2^B)\) 内所有数的情况 . 考虑若做 \(k\) 个序列时答案不正确那么必然存在向量 \(\bm v\) 使得 \(\bm v\) 和每个异或和的点积为 \(0\),一个序列的点积为 \(0\) 的概率不大于 \(\frac12\)(其实不那么显然),那么错误率就是 \(2^{-k}\) .

总共有 \(q\) 组询问,一组错误率是 \(2^{-k}\) . 容易发现取 \(k=\Omega(\log qV)\) 即可保证渐进意义下的正确性 .

[NOIP2023] 双序列拓展

不妨令 \(x_1<y_1\),那么相当于标记网格图上 \(x_i\ge y_j\) 的位置 \((i,j)\) 为障碍,问 \((1,1)\)\((n,m)\) 是否八连通 .

由于对于任意的两行/列上面有障碍的位置集合一定包含或相离,从而只有四种情况:

  • 一行全都是障碍:\(\max x_i\ge \max y_j\) .
  • 一列全都是障碍:\(\min x_i\ge \min y_j\) .
  • 起点被一个 L 封住:存在 \(i,j\) 使得 \(x_i\ge \max_{k\le j}y_k\)\(y_j\le \min_{k\le i}x_k\) .
  • 终点被一个 L 封住:存在 \(i,j\) 使得 \(x_i\ge \max_{k\ge j}y_k\)\(y_j\le \min_{k\ge i}x_k\) .

前两种平凡 . 对于后面两种情况,枚举一维,另一维满足每种限制的位置是一个区间,双指针一下就可以了 .

时间复杂度单次 \(\Theta(n+m)\) .

[WC2025] 士兵

假设 \(i\) 最后受到 \(d_i\) 伤害,那么根据经典结论至少需要 \(\sum\max(d_i-d_{i-1},0)\) 次进攻,从而相当于收益为:

\[C=\sum_{i=1}^nb_i[d_i\ge a_i]-m\sum_{i=1}^n\max(d_i-d_{i-1},0) \]

容易证明 \(d_i\) 要么是 \(d_{i-1}\) 要么是 \(a_i-[b_i<0]\),从而可以设计 DP 每次转移一个 \(d_i\) 相同的段:

\[dp_i=\max(b_i,0)+\max_{j<i}\Big\{dp_j-m\max(c_i-c_j,0)+\sum_{k\in[j,i)}b_k[c_j\ge a_k]\Big\} \]

\(dp\) 数组放到 \(c\) 上线段树优化 DP 即可,时间复杂度 \(O(n\log n)\) .

QOJ #8789. Spin & Rotate!

(科技题,看官方题解吧)

[ARC190D] Matrix Pow Sum

断言:\(\displaystyle\sum_{i=1}^{p-1}i^k\equiv-[p-1\mid k]\pmod p\),证明可以考虑用原根改成等比数列求和 .

首先特判 \(p=2\) . 注意到 \(A^p\) 中的乘积项如果涉及某个 0 就必须重复选 \(p-1\) 次 . 在 \(p\ge5\) 的情况下只可能是选了 \(p-1\) 次对角线上的未知数 \(x_{i,i}\) 和一个别的位置 \(A_{i,j}\)\(A_{j,i}\),当 \(p=3\) 时可能出现 \(x_{i,j}\cdot A_{j,i}\cdot x_{i,j}\) 的乘积项需要特殊处理 . 这两类情况的贡献都是可以简单计算的 .

时间复杂度 \(\Theta(n^3\log p)\),瓶颈在矩阵快速幂(计算不涉及任何 0 的项的贡献).

[AGC055D] ABC Ultimatum

\(f_{\sf BA}\) 是前缀 B 的数量减 A 的数量的最大值,同理定义 \(f_{\sf CB},f_{\sf AC}\) . 断言:合法当且仅当 \(f_{\sf BA}+f_{\sf CB}+f_{\sf CA}\le n\) .

必要性:比如看 \(f_{\sf CA}\),BCA 和 CAB 对 \(f_{\sf CA}\) 的贡献是 \(-1\),ABC 对 \(f_{\sf CA}\) 的贡献是 \(1\),那么令 \(c_{\sf ABC}\) 是 ABC 的个数就有 \(f_{\sf CA}\le c_{\sf ABC}\) . 同样可以写出 \(f_{\sf BA}\le c_{\sf BCA}\)\(f_{\sf CB}\le c_{\sf CAB}\) . 三式相加即得 \(f_{\sf BA}+f_{\sf CB}+f_{\sf CA}\le n\) .

充分性:选第 \(i\) 个 A、第 \(i+f_{\sf BA}\) 个 B、第 \(i+f_{\sf BA}+f_{\sf CB}\) 个 C 组成三元组(下标对 \(n\) 取模). 根据 \(f\) 的定义显然选的 A, B, C 在循环意义上是有顺序的,又 \(f_{\sf BA}+f_{\sf CB}+f_{\sf CA}\le n\) 所以不会转超过一圈,从而选的 A, B, C 合法 .

那么大力 DP 记 A, B, C 的个数和 \(f_{\sf BA},f_{\sf CB},f_{\sf AC}\) 即可 . 时间复杂度 \(\Theta(n^6)\) .

CF1746F Kazaee

每次把序列里的每种数随机改成 0/1 判断区间和是否是 \(k\) 的倍数,随机 \(\Omega(\log_2p^{-1})\) 次即可保证 \(p\) 的错误率 .

[NOI2013] 向量内积

\(\mathbb F_k\) 下考虑问题(首先需要把每个 \(x_{i,j}\)\(k\) 取模).

对于 \(k=2\) 的情况,如果任意两个向量的内积都不为 \(0\) 那么一定都为 \(1\) . 随机若干集合 \(S\) 判断每个 \(\sum_{j\in S}\bm x_i\cdot\bm x_j\equiv |S|\pmod 2\) 即可 . 如果命中只需要让 \(i\) 和集合 \(S\) 内的每个向量点乘一下判断即可找到一组解 .

对于 \(k=3\) 的情况,如果任意两个向量的内积都不为 \(0\) 那么内积的平方都为 \(1\) . 类似地考虑随机若干集合 \(S\) 判断每个 \(\sum_{j\in S}(\bm x_i\cdot\bm x_j)^2\equiv |S|\pmod 3\),拆一下式子即可做到 \(O(nd^2)\) 时间 .

和上一个题一样,随机 \(\Omega(\log_2p^{-1})\) 次即可保证 \(p\) 的错误率 .

随机一次的时间复杂度在 \(k=1\)\(O(nd)\)、在 \(k=2\)\(O(nd^2)\) . 如果用 bitset 可以除 \(w\),不过并不必要 .

Bonus:其实对于任意 \(k\) 的话容易发现只需要考虑内积的 \(\varphi(k)\) 次方就可以单次 \(O(nd^{\varphi(k)})\) 了(如果用 bitset 会乘 \(k/w\),不总是优).

[ARC192E] Snuke's Kyoto Trip

其实感觉也没啥难度,主要就是化简那个大组合数求和有点麻烦,疑似模板 Mathematica(

计算方面有很多种拆法,比如官方题解里的做法是先算没中间那个禁位的方案数然后减掉不合法的方案数,跨越禁位边界的点对可以通过枚举边界上的一个点钦定经过计算,那么就是要算若干个:

\[\sum_{x,y}\dbinom{x+y}x\qquad\sum_{a\le b}\sum_{c\le d}\dbinom{d-c+b-a}{b-a} \]

然后通过一系列化简可以得到预处理组合数后能 \(O(1)\) 计算的表达式,那么就做完了 .

[省选联考 2024] 迷宫守卫

??这你赛时过不了

由于每个点的两个子树大小都相等那么想比较字典序只需要比较第一位,那么记一下点 \(u\) 让第一位 \(\ge x\) 至少需要花多少魔力,显然总状态数是 \(O(n2^n)\) . 输出方案只需每次确定第一位然后去除对应结点根链的贡献即可 .

时间复杂度 \(O(n2^n)\) .

[NOIP2024] 编辑字符串

扫一遍整个字符串如果能匹配就匹配,正确性显然 .

[省选联考 2024] 季风

枚举 \(m\bmod n\) 后经过简单代数变形可以转为求最小的满足 \(|kx-x_0|+|ky-y_0|\le kv+C\)\(k\) 这种问题 . 枚举两个绝对值的符号四个不等式求交即可,此处符号不对只可能让绝对值偏小 .

[Ynoi2007] rfplca / CF1491H Yuezheng Ling and Dynamic Tree

首先如果是单点修改就类似弹飞绵羊记一下跳出块后跳到的第一个位置就可以了 .

区间修改的话考虑到一个位置如果减超过块长那么肯定全都进入前面的块,可以直接打标记,小的情况一个块最多做块长次可以直接暴力 .

取块长 \(B=\sqrt n\) 即可 \(O((n+q)\sqrt n)\) .

CF1086F Forest Fires

\(F(i)\) 是权值不大于 \(i\) 的点数,那么就是要计算 \(\displaystyle(t+1)F(t)-\sum_{i=0}^tF(i)\) .

前者可以直接矩形面积并解决 . 后者考虑令 \(G(S)\) 表示 \(S\) 集合内的每个点对应的权值不大于 \(t\) 的点的交集大小 . 则:

\[\sum_{i=0}^tF(i)=\sum_{S\subseteq[n]}(-1)^{|S|+1}G(S) \]

显然 \(G\) 只和集合中 \(x,y\) 坐标最小 / 最大的四个点有关,可以通过简单推导得到 \(\Theta(1)\) 计算的式子 .

首先注意到如果存在三个点 \(p_1,p_2,p_3\) 满足 \(p_2\) 在以 \(p_1,p_3\) 为对角的矩形内那么在以 \(p_1,p_3\) 为边界的贡献中加入 \(p_2\) 会使得贡献反转符号,从而相互抵消 . 那么只需要考虑不存在这样的三个点的集合 \(S\) .

考虑枚举 \(S\)\(x\) 坐标最小 / 最大的两个点,如果以他们为对角的矩形内没有点那么是可以产生贡献的,容易发现点集中只可能加入这两个点中 \(y\) 最大的点在 \(y\) 坐标上的后继和 \(y\) 最小的点在 \(y\) 坐标上的前驱,其它都没有贡献 . 于是对于一对点对来说贡献都是可以 \(\Theta(1)\) 计算的,排序之后通过链表维护前驱后继即可 \(\Theta(n^2)\) 解决 .

洛谷 P7275 计树

相当于把若干条链连成树,如果 \(m\) 个链的长度分别为 \(a_i\) 那么熟知把它们连起来的方案数为 \(n^{m-2}\prod a_i\) .

此处链相当于极长连续段,可以考虑调用集合划分容斥:令容斥系数为 \(F\),则有

\[\dfrac1{1-F(x)}=\dfrac{x^2}{1-x} \]

从而 \(\displaystyle F(x)=\dfrac{x^2}{1-x-x^2}\) .

\(n^{-2}\) 提出来相当于每个元素还额外贡献一个 \(n\),那么答案就是 \(\displaystyle n^{-2}[x^n]\dfrac1{1-nxF'(x)}\) . 此处 \(n^{-2}\) 以外的部分显然是线性递推的,可以轻松做到 \(\Theta(n)\) 或者 \(\Theta(\log n)\) .

[AGC028C] Min Cost Cycle

抛弃 Hamilton 路的模式,直接考虑答案中可能选中哪些 \(a\)\(b\) .

不妨先不考虑 min 的限制,改成 \(u\to v\) 的边权可以任意选择 \(a_u\)\(b_v\),显然答案不变 . 首先全选 \(a\)\(b\) 一定合法 . 对于存在某个点的 \(a\)\(b\) 都被选中的情况,一定存在同样数量的 \(a,b\) 都未被选中的情况 . 可以这样构造一个环:只有 \(b\) 被选中的点、\(a,b\) 都被选中的点、只有 \(a\) 被选中的点、\(a,b\) 被选中的点(按描述顺序顺次连接),那么可以发现只要存在 \(a,b\) 都被选中的情况其它位置就可以任意决策 .

那么最终解法就很简单了:首先判掉不存在某个位置 \(a,b\) 都被选中的情况,否则枚举一个都选中的位置算剩下的数中最小的 \(n-2\) 个之和即可 . 时间复杂度 \(O(n\log n)\)(排序).

[省选联考 2024] 魔法手杖

按位考虑aaa

[集训队互测 2015] 胡策的小树

写个最简单的做法(

首先考虑 \(a_i\) 不变的情况,令 \(f_i\) 表示充分长时间后 \(i\) 成功的概率,则答案为 \(\sum f_ip_i\) . 注意到:

\[\begin{aligned}\sum_{v\in\subtree(u)}f_v&=\sum_{v\in\subtree(u)\land v\neq u}f_v+\sum_{u\in\subtree(v)}f_v(1-p_v)\dfrac{\size(u)}{\size(v)}\\f_u&=\sum_{u\in\subtree(v)}f_v(1-p_v)\dfrac{\size(u)}{\size(v)}\\p_uf_u&=\sum_{u\in\subtree(v)\land v\neq u}f_v(1-p_v)\dfrac{\size(u)}{\size(v)}\\\dfrac{p_u}{\size(u)}f_u&=\sum_{u\in\subtree(v)\land v\neq u}f_v\cdot\dfrac{1-p_v}{\size(v)}\\\dfrac{p_u}{\size(u)}f_u&=\dfrac{p_{\fa(u)}}{\size(\fa(u))}+\dfrac{f_{\fa(u)}(1-p_{\fa(u)})}{\size(\fa(u))}\\\dfrac{p_u}{\size(u)}f_u&=\dfrac{f_{\fa(u)}}{\size(\fa(u))}\end{aligned} \]

那么如果知道 \(f_1\) 可以简单推出每个 \(f\) . 然而容易发现 \(f_1\) 其实并没有什么用,如果带着 \(f_1\) 推的话可以得到每个 \(f\)\(f_1\) 的多少倍,令 \(f_i=c_if_1\) 则只需要计算 \(\dfrac{\sum c_ip_i}{\sum c_i}\) 即可,正确性显然 .

原题还需要对每个 \(x\) 分别算,显然对于每个 \(x\) 都存在唯一的 \(u\) 使得操作后 \(p_u=0\),那么充分多次操作后 \(u\) 子树外可以看做不可能存在猴子,于是只需要对 \(u\) 的子树做原问题即可 . 由树的随机生成方式可知时间复杂度为 \(\Theta(n\log n)\) .

[清华集训 2014] 主旋律

\(f_S\) 表示点集 \(S\) 的导出子图的强连通子图数量,\(g_S\) 表示 \(S\) 的导出子图的非强连通子图数量,\(h_{S,i}\) 表示将 \(S\) 的导出子图划分为 \(i\) 个强连通分量的方案数 . \(e(S,T)\) 表示 \(S\)\(T\) 中有向边的数量,或者说 \(e(S,T)=\sum\limits_{u\in S}\sum\limits_{v\in T}[u\to v]\) .

首先显然有 \(f_S=2^{e(S,S)}-g_S\),其次钦定一个点集 \(T\) 缩点后入度为 \(0\) 可得:

\[g_S=\sum_{\varnothing\subsetneq T\subseteq S}\sum_i(-1)^{i+1}h_{T,i}2^{e(S-T,S-T)+e(T,S-T)} \]

这里需要一个容斥来将钦定转为恰好 . 转而记 \(h_S\) 表示点集 \(S\) 带容斥系数划分为若干强连通分量的方案数,则有:

\[\begin{aligned}&g_S=\sum_{\varnothing\subsetneq T\subseteq S}2^{e(S-T,S-T)+e(T,S-T)}h_T\\&h_S=f_S-\sum_{\substack{\varnothing\subsetneq T\subsetneq S\\\lowbit(S)\in T}}f_Th_{S-T}\end{aligned} \]

那么直接计算就可以了,过程中需要动态维护一下 \(e(T,S)\) . 时间复杂度 \(\Theta(3^n)\)(应该做不了更快了).

[CEOI 2019] Amusement Park

和上一个题一样做,不过这个题的形式可以子集卷积优化(虽然没有必要).

洛谷 P6295 有标号 DAG 计数

和上一个题一样做,首先不考虑弱连通的限制,\(f_n\) 表示 \(n\) 个点的 DAG 数量,枚举入度为 \(0\) 的点的数量立得:

\[f_n=\sum_{i=1}^n(-1)^{i+1}\dbinom ni2^{i(n-i)}f_{n-i} \]

这种乘积可以类似 CZT 拆,注意到 \(2^{k(i-k)}=2^{\binom i2-\binom k2-\binom{i-k}2}\),令

\[\begin{aligned}&F(x)=\sum_{i\ge0}\dfrac{f_i}{2^{\binom i2}}\dfrac{x^i}{i!}\\&G(x)=\sum_{i\ge0}\dfrac{(-1)^{i+1}}{2^{\binom i2}}\dfrac{x^i}{i!}\end{aligned} \]

那么有 \(F(x)=F(x)G(x)+1\),从而可以简单求出 \(F(x)\) . 然后如果加上弱连通的限制只需要 ln 一下就可以了,时间复杂度 \(\Theta(\mathsf M(n))\) .(此类手法或者可以描述为所谓图论生成函数 (GGF),不过感觉这么刻画也没太有意义)

[省选联考 2024] 重塑时光

还是和上一个题一样做,首先相当于重排前在同一个段内部的点需要保证拓扑序,而且把同段的点缩起来后必须还得是 DAG . 从而只需要对于每个 \(i\) 计算将点集划分成 \(i\)非空部分要求满足上述限制的方案数(后述所有部分都是非空的),此后可以简单转为期望 .

\(f_{S,i}\) 表示将点集 \(S\) 划分为 \(i\) 部分的方案数,\(g_{S,i}\) 表示将点集 \(S\) 划分为 \(i\) 部分且缩完后这些部分互相独立的方案数,\(h_S\) 表示集合 \(S\) 中的拓扑序个数 . \(c(S,T)\) 表示 \(S\to T\) 是否没有任何边,或者说 \(c(S,T)=\prod\limits_{u\in S}\prod\limits_{v\in T}[\lnot(u\to v)]\) .

转移和主旋律那个题是类似的:

\[\begin{aligned}&f_{S,i}=\sum_{\varnothing\subsetneq T\subseteq S}c(T,S-T)\sum_{j=1}^i(-1)^{j+1}g_{T,j}f_{S-T,i-j}\\&g_{S,i}=\sum_{\substack{\varnothing\subsetneq T\subseteq S\\\lowbit(S)\in T}}c(T,S-T)c(S-T,T)g_{S-T,i-1}h_T\\&h_S=\sum_{u\in S}c(S-\{u\},\{u\})h_{S-\{u\}}\end{aligned} \]

直接做是 \(\Theta(n^23^n)\) 的,大力卡一下常数可以通过(主要就是第二维只枚举到 \(\popcount(S)\) 和跳过没值的 \(g\)).

关于更迅速的做法:首先 \(g,h\) 直接做就是 \(\Theta(n3^n)\) 的,看 \(f_{S,\dots}\) 的转移每次相当于卷积,那么写一下 \(f_{S,\dots}\) 的生成函数 \(F_S\) 对应的转移容易发现 \(F_S\) 是不超过 \(n\) 次的多项式,代 \(n+1\) 个点值进去然后插值还原就可以 \(\Theta(n3^n)\) 了 .

[ABC306Ex] Balance Scale

好吧还是 DAG 计数,和上一个题一样做一下就随手了(

CF1874E Jellyfish and Hack

考虑直接求出 \(\operatorname{fun}(P)\) 的分布,\(f_{n,x}\) 表示长度为 \(n\) 的排列中 \(\operatorname{fun}(P)=x\) 的个数,则:

\[f_{n,x}=\sum_{i=1}^n\dbinom{n-1}{i-1}\sum_{j=0}^{n-x}f_{i-1,j}f_{n-i,n-x-j} \]

对行建立生成函数:

\[F_n(x)=x^n\sum_{i=1}^n\dbinom{n-1}{i-1}F_{i-1}(x)F_{n-i}(x) \]

考虑到 \(\deg F_n(x)\le\frac{n(n+1)}2\),那么代 \(\Theta(n^2)\) 个点值进去然后插值还原即可,时间复杂度 \(\Theta(n^4)\) .

最重要的一点:不要用 C++17,几把是 32 位的预处理就 T 了 .

[省选联考 2023] 过河卒

这还是人能出出来的题吗,最后还是 1.00s 极限卡过时限。。

[NOIP2023] 天天爱打卡

唯 一 真 神

总之就是线段树优化一下朴素 DP 就可以了(

[Ynoi Easy Round 2023] TEST_107

总共三种情况,只保留两种相邻颜色中间的段或者只保留一种颜色第一次出现的左边或者最后一次出现的右边 .

扫描线即可 \(\Theta((n+q)\log n)\) .

[THUPC 2022 决赛] rsraogps / [Ynoi2001] 雪に咲く花

扫描线扫右端点,对每个 \(i\) 动态维护左端点 \(\le i\) 的答案之和,之后可以差分出答案 .

一次移动如果 AND OR GCD 都不变那么变化量也不变,可以给每个位置标记一个权值 \(kt+b\)\(t\) 是时间 . 这样每次移动的时候只有上述三者变了的 \((k,b)\) 会变,由于每个元素最多变 \(O(\log v)\) 次所以可以暴力找到这些位置然后修改 .

时间复杂度 \(O(n\log v+q)\),过 Ynoi 版需要一些卡常 .

[Ynoi2005] rmscne

扫描线扫右端点,动态维护每个左端点能延伸的最远长度,每次扩展一位相当于区间赋值等差数列,查询的时候找最大的包含所有颜色的后缀查区间最小值即可 . 以上均可使用线段树维护,时间复杂度 \(\Theta((n+q)\log n)\) .

[COTS 2021] 赛狗游戏 Tiket

就是 \(\Theta(n\log n)\) 求三维偏序:给三个序列 \(a,b,c\),问有多少个 \((i,j)\) 满足 \(a_i\le a_j,\,b_i\le b_j,\,c_i\le c_j\) .

直接看云浅博客:在 O(nlogn) 的时间内计算三维偏序 .

[USACO21JAN] Minimum Cost Paths P

考虑每次加一列维护每行的 DP 值,差分之后是分段一次函数,维护转折点即可 .

[POI 2013] MUL-Multidrink

这才是世上最绝望的死法.jpg 大模拟是吧

HDU2484 Build the Tower

首先如果 DP 记栈结构那么转移是一个树形结构,可以直接树上高斯消元 \(O(n2^n)\) .

然而发现对于栈顶和重量确定的状态能转移到的子树一定也是确定的,同时转移也是从叶子向上转移,所以可以缩成 \(O(nw)\) 个等价类 . 这样再做树上高斯消元就是 \(O(n^2w)\) 的了 .

[清华集训 2024] 阿尔塔尔 2

断言:若 \(u\) 是竞赛图 \(G\) 中出度最大的节点,那么它和所有节点的距离不超过 \(2\) .

证明:假设点 \(v\) 满足 \(\dist(u,v)\ge3\) . 考察 \(u\) 能一步到达的点的集合 \(S\),显然 \(S\) 里的点都没有指向 \(v\) 的边,那么 \(v\) 指向 \(S\) 内的所有点 . 同时 \(v\) 也指向 \(u\),那么自然导出 \(v\) 的出度大于 \(u\) 的出度,矛盾!故命题成立 .

对于原问题,每次随机选择一个点 \(u\) 并找到指向它的点集 \(T\) 和被它指向的点集 \(S\) . 注意到 \(T\) 内根据断言必存在一个点可以两步之内到达其它点,然而显然 \(T\) 内的点都能两步以内到达 \(u\)\(S\) 内的点 . 由于 \(S,T,u\) 覆盖所有结点从而 \(T\) 内必有答案,那么可以把点集改成 \(T\) 递归进入子问题 . 由于 \(u\) 随机选取所以可以看做问题规模每次减半,从而可以在大约期望 \(2n\) 次询问内找到答案,这是完全可以接受的 .

CF1870E Another MEX Problem

如果对于两个区间 \([l,r],[l',r']\)\([l,r]\subseteq [l',r']\)\(\mex(l,r)=\mex(l',r')\) 则称区间 \([l',r']\) 被区间 \([l,r]\) 支配 . 若一个区间不被任何区间支配则称其为关键区间 .

断言:关键区间只有 \(O(n)\) 个 .

引理:满足 \(\mex(l,r)\neq\mex(l+1,r)\)\(\mex(l,r)\neq\mex(l,r-1)\) 的长度 \(\ge2\) 的区间 \([l,r]\) 不超过 \(2n\) 个 .

证明:首先显然有 \(a_l\neq a_r\),不妨令 \(a_l>a_r\) . 考虑到 \(\mex(l+1,r)=a_l,\,\mex(l+1,r-1)=a_r\),以 \(l+1\) 为左端点的区间 mex 单调不降,从而最多只有一个 \(p\) 满足 \(\mex(l+1,p-1)=a_p,\,\mex(l+1,p)=a_p+1\),立得这样的区间个数不超过 \(n\) . \(a_l<a_r\) 方向同理 .

关键区间一定符合引理描述,从而立得关键区间只有 \(O(n)\) 个 . 找出这样的区间后朴素 DP 即可 \(\Theta(n^2)\) 解决问题 .

[Ynoi Easy Round 2023] TEST_90

扫描线后变成区间 flip 区间历史和,其实拿矩阵做也是可以的,需要卡一下常数才能通过 .

[ARC193B] Broken Wheel

由于某些原因答案等于原图的生成森林个数,那么简单 DP 一下就可以求了 .

[Yahoo Programming Contest 2019] Odd Subrectangles

如果选定行之后相当于每列的异或和不全为 0 即可拼出 1,方案数为 \(2^{m-1}\) .

关于有多少种方案选定列异或和不全为 0 的行:首先考虑计算异或和全为 0 的行,其实相当于按行建线性基后张出全 0 的方案数 . 根据经典结论若线性基的大小为 \(s\) 那么答案就是 \(2^{n-s}\) .

那么只需要建一下线性基就可以了,时间复杂度 \(O(n^2m/w)\) .

[JOISC2019] 两道料理

教你怎么用维护差分做后缀加 with 取前缀 max

[ZJOI2017] 树状数组

其实问的就是 \(A_{l-1}=A_r\) 的概率(\(l=1\) 特判). 可以考虑维护每个 \((i,j)\) 相等的概率,相当于在某个 Abel 群上操作,修改相当于矩形乘某个元素、询问是单点查询,自然是可以树套树做的 .

[省选联考 2020 A 卷] 树

维护一个能支持全局 +1 查询异或和的 0-1 Trie,每个点从子树依次 0-1 Trie 合并上来就可以了 .

[APIO2018] 铁人两项

如果选定 \(s,f\)\(c\) 的个数就是 \(s,f\) 间简单路径并的大小减 2 . 可以考虑在圆方树上设圆点的权值为 -1、方点的权值为点双大小,那么圆点两两之间路径权值和即为答案 .

[湖北省选模拟 2025] 团队分组 / divide

也是打上模拟赛了.jpg

步长 \(<\sqrt n\) 的预处理批量跳掉、步长 \(>\sqrt n\) 的最多 \(\sqrt n\) 步可以暴力做,这样就 \(O(n\sqrt n\log n)\) 了 .

posted @ 2025-02-05 19:27  yspm  阅读(291)  评论(9)    收藏  举报
😅​