Exemplary Examples V
导语见 Exemplary Examples I。
T-103 一些组合计数题目 26-1-20 A
我不知道还要强调多少次,计数题呢,容斥,组合,生成函数都有可能,不是只有 dp 这一个办法。
T-046 已经介绍过一些常见方法,复习一下。先说硬推式子。
要广泛尝试,转换贡献主体/递推/改变求和顺序。把处于外层求和的变量,当作常量从内层求和中提到外面。需要注意,在求积式中,乘除的地位与和式中的加减相同,乘方的地位与和式中“乘上系数”的地位相同。所以在和式中常见的 \(\sum(a-b)=\sum a-\sum b,\sum ka=k\sum a\) 在求积式中均有类似物。更进一步地,可以通过 ln/exp 把求积式转化为和式。事实上可以手动写 ln 后对和式做适当的变换,然后手动 exp 回来(这就避免了对积式做操作),并不需要运用多项式。
如果有系数在组合数前面,就要把它弄到组合数里面,一个经典例子就是 \(t\binom{x}{t}=x\binom{x-1}{t-1}\)(或者是形如 \(P(t)\binom{x}{t}\),\(P(t)\) 是任意多项式)。如果不能直接应用上述式子,不妨把系数拆一拆变一变,见 T-046-1;或者把组合数拆一拆变一变,如 T-046-2。也就是用杨辉三角 \(\binom{n+1}{m+1}=\binom{n}{m}+\binom{n}{m+1}\)。
一定一定要把上面大但底下小的组合数,视作关于底下的多项式。这样,就可以把原式子拆成 \(\sum_i f_ix^i\),再把 \(i\) 的计算顺序提前即可。
组合数的列前缀和。二项式定理。卷积技巧,见我在 T-100 介绍的,要把系数摊到 \(i,j,i\ \mathrm{op}\ j\) 上去。
再说组合意义。常见的思路,是构建一个模型,一般是“选取元素”模型,或者“格路计数”模型。可以据此把带权方案数的权值当作组合意义弄到方案里去。
还需要介绍斯特林数。第一类斯特林数是将 \(n\) 个有序元素放入 \(m\) 个无序非空圆排列中的方案数。第二类斯特林数是将 \(n\) 个有序元素放入 \(m\) 个无序的非空盒子里的方案数。第一、二类斯特林数列/行前缀和都得卷积/多项式计算,和组合数的行和类似。非常容易根据其定义,得到第一、二类斯特林数的递推式(其实就是 dp 嘛)。第二类斯特林数更为常用。
在此讨论一下第二类斯特林数的生成函数相关问题。其实在 T-101-1-1 已经讲过。首先,能够看出其合并方法大致是带组合数的,所以尝试指数型生成函数。则“一个非空盒子放 \(n\) 个有序球”的方案数应为 \([n>0]\),其指数型生成函数为 \(F(x)=\sum \frac{x^n}{n!}=e^x-1\)。故“\(m\) 个无序非空盒子放 \(n\) 个有序球”方案数的指数型生成函数应为 \(\frac{F(x)^m}{m!}\)。特别地,“无穷个无序非空盒子放 \(n\) 个有序球”,也就是贝尔数的指数型生成函数显然是 \(\mathrm{exp}(F)\)。
依据这个东西,可以用多项式次幂直接计算一列第二类斯特林数。
第二类斯特林数的通项。首先容斥求出“将 \(n\) 个有序球放到 \(m\) 个有序非空盒子”的方案数(做一手容斥贡献系数,定义 \(f(i)\) 表示将 \(n\) 个有序球放入有 \(m\) 个有序盒子,恰好 \(i\) 个盒子非空的方案数,显然其贡献系数 \(p(i)=[i=m]\)。而容易求出 \(g(i)\) 表示至少 \(m-i\) 个盒子都空的方案数,其贡献系数 \(q(i)=[i=m]-\sum_{j>i}\binom{m-i}{m-j}q(j)=(-1)^{m-i}\)),是 \(\sum_{i=0}^m (-1)^{m-i}\binom{m}{i}i^n\)。给上述式子除以 \(m!\) 就是答案了。
依据这个通项公式,容易卷积直接计算一行第二类斯特林数。
T-103-1 P8367
首先把贡献拆到边上,设 \(a,b\) 前缀和分别为 \(A,B\),则一条边的移动次数应为 \(|A_i-B_i|\),故代价之和应为 \(\sum |A_i-B_i|w_i\)。描述 \(a\) 数组就能算答案,由这个描述法可得一个 dp。\(f_{i,j}\) 表示考虑了前 \(i\) 个盒子,使得 \(A_i=j\) 的方案数;\(g_{i,j}\) 表示带权方案数(答案)。可得 \(O(nm)\) 的做法。这个 dp 过于简单,不可能优化;但是 \(f\) 的转移是极为明显的格路计数,所以容易知道,答案是:
事实上,如果我们一开始就不做 dp,而是直接组合求“\(A_i=j\) 的方案数”,也能得到上述式子。拆掉绝对值,只需对每个 \(i\) 快速求 \(\sum_{j\le D} j\binom{-1+i+j}{j}\binom{(n+m-1)-i-j}{m-j}\) 以及 \(\sum_{j\le D} \binom{-1+i+j}{j}\binom{(n+m-1)-i-j}{m-j}\) 就行了。试图硬推式子,没有完全成功,但是根据系数吸收的方法,可得 \(j\binom{-1+i+j}{j}=i\binom{-1+i+j}{j-1}\),故只需解决两个式子中靠后的一个。又尝试生成函数,没有进展。
因为是 \(O(n)\) 个本质相同的式子,可递推。递推前后的状态要有关,不妨让相邻的 \(i\) 互相递推,按 \(i\) 从小到大依次计算,则 \(D\) 变化量总计 \(O(m)\)。记录 \(h(i,D)\) 表示上述式子,则只需由 \(h(i,D)\),\(O(1)\) 递推 \(h(i,D+1),h(i+1,D)\) 即可。前一种直接算。关键的是后一种,硬推式子求变化量并不好做。
用组合意义,\(h(i,D)\) 的意义是“从 \((0,0)\) 走到 \((n,m)\),且在第 \(i\) 列的最高高度不超过 \(D\)”的路径数。用 \(h(i,D)\) 减去“在第 \(i\) 列不超过 \(D\),但第 \(i+1\) 列超过 \(D\) 的路径数”,有
这就把答案分解成了两个组合数列前缀和
当然,边界情况下,组合意义可能失效,单独计算即可。
T-103-2 QOJ7509
第一步是 trick,把奇数层的点权 01 反转,则一次操作可以看成是“让‘一’移动一条边”。那对于一条边来说,最优方案下它的总计经过次数应该是其子树(边上任一端点的子树都可以)内 \(s\) 权为一的个数 \(S_i\),减去 \(t\) 权为一的个数 \(T_i\),的绝对值。只需描述 \(s,t\) 即可,用常规树形 dp,定义状态 \(f_{i,j}\) 表示分配 \(i\) 的子树内 \(s,t\) 的权值,使得 \(S_i-T_i=j\) 的方案数;\(g_{i,j}\) 表示带权方案数。树上背包做到 \(O(n^2)\)。
这个 dp 没办法优化。所以直接组合计算,对于一条边,一次性把它对答案的贡献算清。定义该边的子树内 \(s,t\) 的问号个数分别为 \(x,y\),非问号部分的 \(S_i-T_i=z\);\(s,t\) 总问号个数 \(A,B\),总的非问号部分和为 \(C\)。该边的贡献就是
想要简省循环,但是 \(C+i-j+k-l,|z+i-j|\) 这两个“权值”必须能够计算。那么改为枚举 \(i-j=p,k-l=q\)。范德蒙德卷积,可得答案是
再换一手元,可得
递推,先想出已知 \(f(i,D)=\sum_{j\le D}\binom{i}{j}\binom{m-i}{n-j}\) 如何求 \(f(i+1,D)\)。本题可以“看作选择小球”,\(f(i,D)\) 表示“\(m\) 个球中,共选 \(n\) 个,要求前 \(i\) 个里面至多选 \(D\) 个”的选取方法数。只需用 \(f(i,D)\) 减去“前 \(i\) 个里面恰好选 \(D\) 个且第 \(i+1\) 个被选”的方案数,就得到 \(f(i+1,D)\),比 T-103-1 还要简单一点。
不过得找个递推方法使得 \(i=x+y,w=z+x\) 的变化量不多。这相当于是把 \(x,y,z\) 互相独立地拆开,要求它们三个的变化量均不多。对于三个中的任一种,例如对 \(x\),就是说树上点有点权为 \(O(1)\),求出了子树内点权和 \(v_i\)。有两种行走方法,想要访问所有节点,使得代价和控制在 \(O(n\sqrt n)\) 及以下。第一种是由 \(x\) 走到相邻的节点 \(y\),代价是 \(|v_x-v_y|\);另一种是直接传送任意节点 y,代价是 \(v_y\)。
这是个树上问题,把树上问题的各种方法过一遍。那么首先猜想,按照任意 dfs/bfs 访问。其次猜想,用树上莫队直接处理。再猜想,用树分块,分作“块内-块间”的代价分别计算,也许块内用 dfs 处理,而块间直接传送。最后是用树剖。结果只有树剖是正确的。也就是说,每次传送到某重链的链头,并从链头到末尾走相邻。显然代价是链头子树大小之和,也就是 \(O(n\log n)\),可以通过。
T-103-3 CF932E
注意 \(k\) 极小。这是个加权方案数问题,应该把权摊到方案数里。我刚才说,分析组合意义不妨考虑“小球-盒子”模型。只需求“选择若干元素作为‘重要盒子’,并把 \(k\) 个有序小球分配到这些有序盒子内,不准有空盒子;剩余‘不重要盒子’任选一个子集作陪嫁”的方案数。答案就是 \(\sum_{i=1}^k \binom{n}{i}{k \brace i}i!2^{n-i}\),直接递推算斯特林数即可。
T-103-4 CF1278F
核心式子形如 \(\sum i^k\binom{n}{i}(m-1)^{n-i}\)。希望把 \(i^k\) 的系数用第二类斯特林数做掉,先考虑斯特林数能做什么,它能做把 \(k\) 个小球放到 \(t\) 个非空盒子的方案数。但是此处 \(i^k\) 的组合意义没有要求“非空”。T-103-3 中我们枚举了实际非空的“重要盒子”,并在外面做陪嫁。那么此处也应一样
\(t\) 在外层枚举了,所以内层循环必须 \(O(1)\) 求。这个形式近似于二项式定理。做一个适当的变换
直接递推算斯特林数即可 \(O(k^2)\),用卷积做到 \(O(k\log k)\)。事实上,还可进一步做到 \(O(k)\) 的复杂度,见洛谷文章 fhsz8k9q。那么这就是第二类斯特林数的常见应用,它能够把形如 \(\sum i^k\binom{n}{i}\) 的式子做掉。扩展一下,也能把 \(\sum P(i)\binom{n}{i}\),其中 \(P(i)\) 是多项式的式子做掉,例如 P6620。
T-103-5 P5518
对于 type=2,我不喜欢求积式,所以手动求 ln 变成
利用欧拉反演公式 \(n=\sum_{d|n}\varphi(d)\) 或莫比乌斯反演 \([n=1]=\sum_{d|n}\mu(d)\to p[n=p]=p\sum_{d|(n/p)}\mu(d)\) 可得
括号内本来是 \(\gcd(id,jd)\) 类似物,但是可以分数上下约掉 \(d\) 变成 \(\gcd(i,j)\)。所以内层三个循环就变成比较明显的整除分块。手动 exp 回来,变成
其中 \(F\) 代表 type=0 时 \(A,B,C\) 分别为传入参数时的答案。至于 type=0,1 时的思路,恐怕还是硬推求积式比较容易。
T-104 一些优化 dp 题目 26-1-21 A+
补充:如果感受到/贪出来优秀的状态不满,如 P9602。那么可以通过 map 当数组、只开有效状态(哪些状态有效,可以在 dp 的过程中生成,而不是预先通过描述法处理)的方式完成 dp。
T-104-2 P10145
若只有一个查询 \([q_l,q_r]\) 怎么做。是在线段树上的问题,不妨设计类树形 dp 的状态。分析一下可得 \(f_{x,0/1}\) 表示关注 \(x\) 的子树(\(x\) 节点维护的信息是 \([l_x,r_x]\) 的和),\([q_l,q_r]\cap[l_x,r_x]\) 的和只通过子树内选取到的节点就能算/算不了但是“若配合上子树外节点的合适选取,使得 \(x\) 节点维护的信息可被算出,就能算了”的方案数(因为外界信息至多能求出 \(x\) 节点维护的信息,其它子树内信息都求不出)。为了转移 \(f_{x,1}\),还要额外记录一维辅助状态表示“只通过子树内选取到的节点能不能求出 \(x\) 节点维护的信息”,真正合适的状态定义是 \(f_{x,0/1,0/1}\)。注意到上述 \(f_{x,1,1}\) 不存在,故更改定义为 \(f_{x,0/1/2}\) 表示关注 \(x\) 的子树,\([q_l,q_r]\cap[l_x,r_x]\) 的和只通过子树内选取到的节点就能算,且据这些节点能算 \(x\) 维护的信息/能算但不能算 \(x\) 维护的信息/两个都不能算所以必须能通过外界去算 \(x\) 维护的信息从而算第一个和,子树内选取的方案数。转移 \(O(1)\)。同时处理多组询问,就需要改成 \(f_{x,s}\) 表示处理到 \(x\) 子树内的信息,且若仅有第 \(i\) 个询问则原第二维状态是 \(s_i\) 的方案数,复杂度 \(O(n6^m)\)。
把缩减状态的方法复习一下。有更换描述法或从答案角度考虑扔掉无用状态、状态答案互换、整体 dp 等。总之只记录 \(f_{x,s}\neq 0\) 的状态,应该能过很多个点。试一试,惊奇地发现合法状态的量级是 \(O(n^2)\) 的。对于一个 \(x\) 来说合法状态是 \(O(n)\) 甚至 \(O(\mathrm{siz}_x)\) 的。
首先若任一 \(s_i\) 为零,则所有 \(s_i\) 均为零(这是状态定义里面暗含的,可分析出,也可打表看出),接下来把 \(f_{x,s}\) 分成两个,一个是 \(g_x\) 特指 \(s_i\) 全为零的方案数;另一个是 \(f_{x,s'}\),\(s'_i=s_i-1\)(我这样分只是为了后面写转移容易,事实上无需明确地拆开,只需讨论每种转移即可)。转移有若干种,如 \(g+g\to g,g+f\to g,g+f\to f,f+f\to f,f+f\to g\)。第一种和第二种容易做。最后两种,因为转移要求左右两个儿子的 \(s\) 一模一样,所以也容易转移(枚举较小儿子的所有有效状态并根据字符串哈希值转移即可)。第三种则相当于全局乘。做完之后启发式合并就可以了,复杂度 \(O(n\log^2 n)\)。这一段我没写,不知道是真话还是假话,很可能是假的。
这种两维 dp 只记有效状态的题目如 P13538 还是很常见的。至于为什么状态如此之少,见洛谷文章 yi7nj4k0。
T-104-3 P12074
用描述法,只为答案服务,答案是形如 \(\sum \pm x_i\) 的形式,所以只需描述 \(x_i\) 之前的系数即可。关键是验证一个解是否实际存在,这是个判定性问题,一般用调整法或者贪心甚至 dp 解决,先尝试贪心。这是形如“把 \(x_i\) 放到盒子 \(a_j\) 里”的问题,有两个限制,一个是“每个 \(x_i\) 恰被放进一个盒子,且系数正确”,第二个是“有用的盒子数目不超过 \(n\)”。贪心策略显然是每次将最靠后的 + 拿出来,在它前面找出最靠后的 -,再找出最靠后的 +,循环往复直到没有“未被放入盒子的合法元素”,此时给计数器增加一,并从头再来。判断计数器的数值和 \(n\) 的大小即可,但计数器的数值难以求出。
在本判定性问题中有两个轴,一个是“盒子轴”,另一个是“位置轴”。刚才是以“盒子轴”为最外层,现在改用“位置轴”为最外层。倒序扫描位置轴,维护“已经使用的盒子里面,最接近当前位置的那个系数是 + 还是 -”。加进来 \(x_i\) 前的系数,如果是 + 就找 - 盒子,反之亦然。如果盒子不够且当前是 +,新开一个盒子即可;反之就完蛋了。换句话说,所谓“计数器的数值”就是后缀和的最大值。特别是如果后缀和的最小值小于零,则不可能合法。
定义状态 \(f_{i,j}\) 表示倒序确定了后 \(i\) 个元素的系数,当前系数和是多少。转移形如 \(f_{i,j}\gets \max(f_{i-1,j-1}+x_i,f_{i-1,j+1}-x_i)\)。明显的整体 dp,因为这是原函数与满足 \(g(-1)=x_i,g(1)=-x_i\) 的函数 \(g\) 做 max/+ 卷积的形式,用 slope trick。但是 \(g(0)=-\infty\),所以它不是上凸函数,无法直接闵和,那怎么办呢?像这种 \(g(0)=-\infty\) 的东西一旦出现,就提示我们,通过将 \(f\) 先按照某种转移平移,然后重写 \(g\)。具体来说,强制将 \(f\) 移动 \((-1,-x_i)\),然后 \(g\) 就变成 \(g(0)=0,g(2)=2x_i\)。虽然它仍不为凸函数,但经过换元就是了。换句话说,令 \(f_0'(x)=f(2x),f_1'(x)=f(2x+1),g'(x)=g(2x)\),那就是让 \(f_0',f_1'\) 分别与 \(g'\) 做闵和。
T-104-4 CF1821F
我真求求了,看到计数题,一定一定要条件反射地想组合、生成函数、容斥啊。尤其是限制复杂的时候,更要考虑容斥。当然还有换贡献主体等。
如果选取树为主体做描述法,在 dp 过程中做合法性判断,只能得到不优的做法。从答案的角度看,合法性判断相当于是加在方案数上的权值。我一再强调,因为描述法要对答案服务,所以描述法一定要便于计算权值,其它怎么样都可以。更改描述法为“被覆盖的位置”,只需描述 \(m\) 个被覆盖段的首位 \(a_i\) 即可,权值不为零的(合法的)覆盖方案当且仅当相邻元素之差大于 \(k\)。
这类似于“方案”和“操作序列”间的对应,可钦定字典序最小,对于一个种树方案,要求砍伐方案尽可能向左倒,这就把种树方案,和砍伐方案(覆盖方案)多一对应了。据此,若 \(a_{i+1}-a_i>2k\) 则第 \(i+1\) 段所表示的树只能种在段右端点;若 \(a_{i+1}-a_i\in(k,2k]\) 则有两种种法。据此得到 \(O(n^2)\) 的 dp 状态,表示考虑了前 \(i\) 个位置的覆盖段,且 \(i\) 恰好是覆盖段起始位置,共计 \(j\) 个覆盖段的加权方案数。转移形如 \(2f_{i,j}\to f_{t,j+1}[t\in(k,2k]],f_{i,j}\to f_{t,j+1}[t\in(2k,+\infty]]\)。这个形式的 dp 如何优化呢?
上生成函数。答案就是
把分子分母分开,就是两个常见生成函数的卷积,写出对应的组合式子后,容易通过前缀和优化做到 \(O(n)\) 的复杂度。我后来发现,如果直接选树为主体,也能用生成函数处理。但是经过描述法的转换,还能改用其它办法,例如进一步改换描述法记录 \(a_{i+1}-a_i\),则相当于把 \(n-m(k+1)\) 个无序小球分配到 \(m\) 个有序盒子里,按照有多少盒子大于等于 \(k\) 个球做带权计数。容斥一手,得到和生成函数做法完全相同的式子,一样 \(O(n)\) 计算。
T-104-5 P12546
变一下式子,这相当于差分数组递增,这意味着函数是离散单谷函数。谷底两边无关,拆开。也就是将原序列排序后,要求将其划分为两个差分数组递增的子序列,问能否办到。dp,状态 \((i,j,k,l)\) 表示第一个子序列的最后两个位置分别为 \(i,j\)、第二个子序列的最后两个位置为 \(k,l\),是否合法。状态不满,共分为三部分,分别是 \((i,i-1,k,l),(i-1,i-2,i,l),(i,i-2,i-1,l)\)。所以实际状态数 \(O(n^3)\)。
现砍状态,因为 dp 数组里的值是 01,不妨状态答案互换。对于后两个部分,能够证明 \(l\) 尽量大时更优,因而这两部分的总状态被砍成总计 \(O(n)\)。但对于第一部分,似乎没有类似的贪心结论。只能整体 dp,我们惊奇地发现,扫描 \(i\) 时,整个二维数组是容易维护的,查询也是容易的。
T-105 一些“子图”题目 26-1-22 B
一些判定性最优化/计数问题,很有可能是一旦出现一个局部“子图”,就能够判定合法性。这个局部子图的得到方法,一般是尝试任意画几个相关的元素(一般是在某些维度上相邻的)作为“子图”。还可以尝试在已有子图上做增量。
T-105-2 QOJ16604
首先分析三染色的性质,容易知道任一三元环三个节点颜色互不相同。若两个三元环公用一条边,则剩余两个节点颜色相同。据此画一下相邻的若干个格子作为子图,你会发现形如 [[NN],[NZ]] 的子图必不合法。也就是说如果存在 \((i,j),(i+1,j),(i,j+1),(i+1,j+1)\) 四个格子中的 N 个数或者 Z 个数有其中一个是“一个”,则子图不合法。
这限制比较复杂,不能直接用。不妨转图论,上类 2-sat,也就是往 2-sat、二分图染色、扩展域并查集的方向想。限制形如“若 \((i,j),(i+1,j),(i,j+1),(i+1,j+1)\) 中有两个格子相同,则剩下两格子也相同;若有两格子不同,则剩下两格子也不同”。如果想要建立 \(O(n^2)\) 个点,图是建不出来的。不妨改主体为“边”,也就是记录“直相邻/斜相邻的两个格子是否相同”作为 2-sat 的零一状态,事实上表示斜邻的变量并没有用。为了字典序最小,依次枚举每个格子并尝试填 N,用一次 2-sat 判断是否有解,若有解就填 N 反之填 Z,总复杂度 \(O(n^4)\)。
注意这个图十分特别,图里说,对于同一个 \(i\),所有 \((i,j),(i,j+1)\) 的关系都一样。既然一样,你要那么多变量没有用嘛。所以把一列边缩为一个变量,减少列邻变量和行邻变量到 \(O(n)\),只用它们建图,似乎建不好。
用描述法,只需描述 \(O(2n)\) 个变量就能够描述整个图。刚才所描述的相当于“差分数组”,不妨改为描述“原数组”,例如“第一行和第一列”。第 \(i\) 行变量异或上第 \(j\) 列变量,就该是 \((i,j)\) 格子的状况。据已知的格子状况,先把颜色一定相同的行、列变量缩合。然后在颜色必不同的缩合节点间连边建立二分图。二分图就有一个好处,其一个连通块仅两种染法。按块内编号最小节点的编号,将这些连通块排序,依次染色即可,每个连通块只染一次。所以说,无向 2-sat,可直接改用并查集加二分图,还能算“合法染色方案数”,这就很好。
T-106 P9167 26-1-28 B+
称题目输入的图为“终图”、删去额外道路的图为“初图”。因为分裂成了 \(t\) 个初图连通块,且为了让它们终图连通,新的连边只能由 \(t\) 个点作出,所以每个连通块恰有一个节点属于“子图”。同时,这些点间的所有边都必须被包含在“子图”中。换句话说,只需描述“子图”的点集就够了。
考虑双元限制,以“初图连通块”为主体。对一个连通块,称同时被它和“子图”包含的点为它的“关键点”。任两个连通块之间只能有一条终图边,且这条边必须连接两个关键点。因原图是任意无向图,所以尝试建立 dfs 树、圆方树、边双缩点树辅助分析。经尝试可得关键点必然是终图割点。建立终图的圆方树,只需描述其上的一个圆点集合作为“子图点集”。对它的限制有两个,一个是“每个初图连通块仅一关键圆点”,第二个是“关键圆点依终图边连通”。现在想要翻译这两个限制,写出“合法圆点集合”的若干“必须满足”的性质。
看第二个限制,改单点限制,对一个关键圆点,它至少向外连一条边到另一关键圆点。若这两个关键圆点之间另外包含圆点,则“圆方树就不是圆方树了”。所以任两个关键圆点之间没有其它圆点。任意给圆方树定一个圆点为根,钦定此根必须属于关键集合。据此看第一个限制,这需要找出“初图连通块”与“关键圆点”间的一一对应关系。不妨从边界考虑,考察“不存在子树节点也被选择”的那些“‘叶子’关键圆点”所在的初图连通块是谁。具体思考一下,你会发现若“有亲儿子被选,但除了亲儿子以外不存在子树节点也被选”的“‘叶子’方点”的亲儿子若不被全选,则“初图连通块”不存在合法分配。综合写一下限制,对任一方点,要么所有相邻圆点都被选择,要么只有一个圆点被选择。
根据上述两个限制,可以 dp。但是根如何选择呢?核心问题是,一个连通块可能被不同的根所计算。类比“原序列-操作序列”钦定字典序最小的思路,可钦定根是关键集合内标号最小的圆点,枚举根做多次 dp。注意无论 \(k\) 是多少,合法的连通块大小(若 \(k=1\) 则是较小的连通块的大小)只有 \(O(\sqrt n)\) 种,而且具体是哪些容易求出。所以共计跑 \(O(n\sqrt n)\) 次 dp,总计 \(O(n^2\sqrt n)\)。经过类卡常的若干优化,可得到 65 分。
我一再强调,我说无根树问题要先定根嘛,一般不是随便定,而很可能是定重心、直径端点、直径中点等。在本题中直接定重心,容易证明合法集合必须包含重心。所以总复杂度 \(O(n\sqrt n)\),能够通过。我在此重新解释一下所谓“原序列-操作序列”的“钦定字典序最小”是什么。原本,原序列-操作序列是多对多的。现在出于一些原因,必须把操作序列放在描述法的前列,贡献顺序提前,也就是选择描述“操作序列-使得该操作序列合法的原序列”个数。但是注意到对同一个原序列,有多个操作序列都符合条件,这就算重了。一个常见的方法是统计每个原序列能够被多少操作序列计算,如果此个数对各个原序列均相同,只需让答案除以上述值即可。如果不行,一般就“钦定多对一”,也就是钦定一个原序列只能有一个操作序列“真正合法”,一般就是“在所有合法操作序列中字典序最小”。这个字典序是什么你自己定。
T-107 P9170 26-1-29 A
首先“B 不准选相同的数”这一限制明示图论建模。第一个想法是建立类 2-sat 图,但是这里面的边不全是双向边,所以不能简化为二分图/种类并查集问题,必须跑 2-sat,似乎没有前途。因此尝试另一个套路建模:有两个长度相同的数组时,不妨令 \(a_i\to b_i\);特别是只有一个数组时,不妨令 \(i\to a_i\)。另外说一句,若题目给出类似“边权邻接矩阵”的矩阵,一定要直接上手建图。在本题中,这就意味着对一个值建一个点,令 \(T_{i,0},T_{i,1}\) 之间连无向边。
现在思考性质 A,也就是判断无解。连通块之间没有关系,拆开。以边为主体,可以看作给它定一个方向,B 本次选择的点,就用边指向的节点表示。这样一来,就可以用度数刻画限制:对于一个点,它入度必须小于等于一(仍然是套路)。但还是难以判断无解。有一个被我长期忽略的办法,叫做用数量关系刻画限制,或者说类势能法。在本题中,若一个连通块的节点个数小于边数,则连通块不可能合法。反之,连通块要么是树要么是基环树,必然有合法的定向法,所以必然合法。
看性质 B,也就是一个环。我认为,性质 B 对于想到所谓“套路建模”很有提示性,因为你明显能感受到性质 B 里有个类链/环的东西存在,为了让它出现,就只好按照“套路建模”建图了。对于一个环或者一个基环树构成的连通块,B 只有两种定向法。具体来说,环上有两种定向法,而非环边,一定是从接近环的一端指向远离环的一端。设 A 有 \(a\) 个决策一定对非环边造成代价,有 \(b\) 个决策当且仅当环顺时针定向时造成代价,有 \(c\) 个决策当且仅当环逆时针定向时造成代价,有 \(d\) 个决策可以选择是当环顺时针还是逆时针转时造成代价。那么答案大致是 \(a+\frac{b+c+d}{2}\)。
对于连通块是树的部分,B 将不止两种定向法,因为他可以任选一个根作为“不受代价点”,令其它边都由浅点指向深点。思考性质 C,也就是若 A 决策固定时怎么做。此时重点在于迅速求出根在各个地方的答案。这是一些本质相同问题,不妨改变贡献主体,以 A 的决策为主体。具体来说,定义以 \(x\) 为根的答案为 \(f_x\),则 A 的一个决策会让某条边某侧的所有 \(f_x\) 都加上一。直接用线段树维护做到 \(O(n\log n)\)。
对于整道题,因为 A 的决策并未确定,所以并不知道他会让边的“哪一侧”加上一。这问题对于 A 来说是最优化问题,用调整法,取双元调整。也就是取两个“未定边”,你会发现若这两个边“背靠背”加一,则可以调整为“面对面”,故不优。换句话说,最优解中任两条边不“背对背”。但仍不好做,因为在本题中此处,双元限制不好使了。
以“未定边”为主体,把未定边断开后得到的树上连通块缩成一个点,可得一新树。以树的常见特殊性质,链入手。假设链上有若干未定边,经过观察可得有一个分界点,分界点左边全选“右侧加一”,分界点右边全选“左侧加一”。改到树上,易得树中任一条链上,上述性质仍旧成立。进一步分析二元限制,任取两条链。若不相交则不太好办,若相交则可得,其分界点必在同一个“缩后点”处。现在已经很明显了,全局分界点在同一“缩后点”,也就是说枚举全局分界点后,以它为根,则所有“未定边”都选择“浅”的一侧加一。换根并用线段树维护,即可做到 \(O(n\log n)\)。
当然,为了得到“存在全局分界点”的结论,还可以尝试“子图添点”的策略。也就是说,若当前子图是“缩后两点”,则对边方向无限制;添一边,成为“缩后三点”,有对边的二元限制;再添一边,有两种添法,一种是“三儿子菊花图”,另一种是“四元链”。利用这种“类似小样例手玩”的方法,也许你能看出性质。同时,我们还可以在得到“链存在分界点”结论后,再应用“子图添点”:先画出一条链,并标出其分界点所在“缩后点”。然后往链上任意处多挂一个节点,则连接该节点和链的那条边,也一定遵照“分界点”选侧。据此能从“链有分界点”推出“树有分界点”。
T-108 P8293 26-1-30 B+ 孩子们我居然会做这个题 O(∩_∩)O
括号序列有几个经典转化。第一个是,将所有位置的前缀和拉出来,绘制折线图;第二个是,合法括号序列必然能够被描述成树的结构(很多区间 dp 就是基于此设计的,所以区间 dp 和树形 dp 有相近之处)。接下来尝试把题目翻译到“折线图”“树”的背景中去。经尝试,认为转化成树结构更恰当。当然,也可不这样转化,这样做的目的只是为了简化叙述,并利用一些现成的定义。
当然,也可先胡乱画一个合法括号序列的样例,并尝试做几个题目所示的操作。你能感受到“无论怎样操作,整个括号序列都合法”这一性质,或许能引出“树结构”的转化。所以说,没思路的时候模拟小样例、模拟特殊性质、子图添点,也许有启发作用。
那么在树上,一个节点相当于一对匹配括号。一次操作就相当于选择某节点 R 的两个儿子节点 A,B(假设 A 儿子节点的子树分别为 aa,ab,ac,ad,...,B 的为 ba,bb,...),删除 A,B,并新造两个节点 C,D,其中 C 的父亲是 R,而 C 的儿子包括 aa,ab,...,ba,bb,...,D。因为关注的是左括号的权值,不妨令每个节点的点权为配对括号中左括号的权值。这样一来,C,D 的权值分别是原 A,B 的权值。
改换主体,以左括号,或者说“权值”为主体(因为答案计算仰仗权值的处理)。对一个左括号,从势能的角度看,其深度只增不减。我曾经在 T-102 中介绍过,树上问题深度轴可以被纳入考虑范围。而在本题中,因为“转移”具备由浅入深的偏序关系,所以“深度轴”适合做最外轴。具体来说,由浅入深扫描深度轴,每次加入原树上深度为 \(i\) 的节点到“待考虑集合”中,然后把所有应在当前深度做的操作都做了。“能做尽做”的意思是,操作后第 \(i\) 层只存在一个节点,每层最重要的决策,其实就是“这个节点是谁”。能感受出,也能严格证明此贪心的正确性,它的正确性来源,其实主要是“深节点不会变浅”。
可分析出,同时处理一层的实际过程,应该是多次进行“选择两个深度仍等于 \(i\) 的‘待考虑’节点,并选择其中一个深度加一”。若 \(x=0,y=0\),无脑输出零。若 \(x=0,y=1\),则一次操作的代价是“被改深”节点的权值。所以核心是“保留一个节点在这一层不被改深,则本层的代价和,就不用计算该节点的权值,而其它节点的权值都必须计入”。因此保留当前权值最大的节点最优。若 \(x=1,y=1\),贪心地保留当前权值最小的节点一直到最后才增加深度,每次都让它和别人做操作。这样一来,本层代价和就是“权值和减去最小权值并加上,最小权值乘以,‘待考虑’集合大小减一,的积”。关键是要保证小权值节点活得久,所以每次还是保留当前权值最大的节点。
若 \(x=1,y=0\)。贪心策略应该还是保留当前权值最小的节点一直到最后才增加深度,每次让它和别人做操作,于是这些操作的代价都是最小权值。但究竟保留谁,也就是说是不是“小权值节点”就该保送呢,其实不一定。先算出每一层“结算后”待考虑集合内的节点个数,特殊情况是“结算后”一个节点都不剩时,本层不用付任何权值。因此,正确决策可能是保送一个较大权值节点到后面某“不用付权值”的层。这看起来很复杂,似乎必须描述“每层保留哪个节点”这一排列才够用。
你要相信,题目没有那么困难。不会做的时候,仔细看看你所想象的情况究竟会不会出现。因为原图是一棵树,所以“一个节点都不剩”的层仅有一段前缀,以及最后面的那一层。也就是说,把前缀特殊处理掉,则最多有一个“免权层”,它还在最后面。枚举究竟是哪个关键点保送到这“免权层”,则途中的一切决策都是“尽量保送小权点,但如果只能保一个,放弃小权点,保送关键点”。复杂度 \(O(n^2\log n)\)。优化其过程,“弃保小权点”当且仅当“结算后只剩一个节点”,故按照“只剩一节点”为端点分段,每段预处理一下,总复杂度 \(O(n\log n)\)。
T-109 P8331 26-2-2 A
题面强调,图是“简单图”,也就是说,图具备若干性质。翻译一下题意,它说,给定的图存在一种重赋边权的方法,使得任两个简单环权值和相同。观察特殊性质,你会发现树、点仙人掌均满足该性质。点双缩点,显然不存在简单环同时在多个点双中选点。换句话说,只需每个点双作为“子图”都具备上述重赋边权的方法即可。
“子图添点”,或者说耳分解增量构造。初始子图选择一个环,满足性质。给上面随便加一个“耳”,因为是点双,故只能增加“一条起点和终点都在初始环上的路径”,称作“一个弦”,仍旧满足性质。再添一个“平行弦”,此时不满足性质;若经过添弦使子图成为“奔驰车标”,则也不满足性质;若是“退化奔驰车标”,也就是说两条弦终点不同但共用起点的,仍不满足性质。换句话说,任意点双都必须形如,一个环以及若干起点终点均相同的弦,又称杏仁。因为容易证明,在杏仁上继续做增量构造,如果得到的不是杏仁,则必不合法。
现在就好办了,在圆方树上考虑 \(s\to t\) 的路径,把路径位于每个点双的部分独立出来,只需会求“某两个同属一个点双的圆点之间的,简单路径条数及权值和”,分讨一下即可。求整个答案,因为上述信息具备可合并性、可减性,故只需在圆方树上做类树上差分,复杂度 \(O(n\log n)\)。当然,若不计时限,则树剖也可,而无需用到可减性。
T-110 P10140 26-2-2 B+
是仙人掌?建立圆方树。本题对行走方案有“不能走回头路”的限制,所以不能像普通期望题那样,直接写出方程组消元了。按照我的说法,期望就是加权方案数。在此,我建议你任画一棵仙人掌,并画一条路径,得到对“行走方案”的理解。
这个“权值”跟路径本身关系极大,也就是说能贡献权值的主体,没有比路径本身更简单的。所以只能 dp 路径了,思考类树形 dp。定义 \(f_{x,0/1}\) 表示在圆方树上,从与本圆点 \(x\) 处于同一点双的祖先圆点,经顺/逆时针行走到本点,不准访问本点子树,加权方案数是多少。\(g_x\) 表示从祖先圆点 \(u\) 向其儿子方点 \(x\) 的子树行走(之前没有访问过子树中的任何节点),经某种办法绕回 \(u\) 的加权方案数。\(h_u\) 表示从 \(u\) 向若干方点儿子都走了,最终仍绕回 \(u\) 的方案数。那么 \(h_u\) 可以对 \(g_x\) 背包得到,\(f_{x,0/1},g_x\) 均容易计算。
算实际答案 \(a_x\) 的时候,应该是要在圆方树上做 dfs。dfs 走向儿子方点 \(y\) 时,要额外乘上一个系数,因为可能访问了本圆点的其它方点儿子并绕回来后,才走向 \(y\)。需要用可撤销背包处理。
T-111 P11832 26-2-2 A
理解一下题意,它是要你把图拍平到一个由节点编号构成的序列上,将每条边改成序列上的对应区间,要求区间彼此不交,但允许相离和包含。问这种序列的字典序最小值。先想特殊性质 AC,也就是一棵树。
树上问题嘛,递归子问题。最优化问题,不妨贪心。假设已经得到了各个子树的合法最小字典序序列,现在合并子树,显然子树之间不准穿插,换句话说,一个子树是序列上的一个连续段。关心的是子树之间的顺序,以及根节点的位置。按照每个子树的序列开头值,以及根节点的编号,进行联合排序即可。现在看 C 性质,此时,原图的一个连通块并非一定是序列上的连续段。但是各个连通块互相独立,可以先各自求出自己的最小序列。上“子图添点”,初始子图只有一个连通块,其序列形如 XXXXX(字母代表来自哪个连通块)。添加一个连通块,则必形如 XXXXXOOO 或者 XXOOOXXX,而不能形如 XXOOXOXX。故一位一位填序列,并维护一个栈,每次在“未使用的连通块的序列开头”以及“栈顶代表的连通块的序列的下一个位置”中选择编号较小的填写。若选择了第一种,则令新连通块入栈。
我一再强调说,题目给定了任意无向图,一般不是建立 dfs/bfs 树,就是边双/点双缩点。建立圆方树,大概率每个点双是独立的,所以考虑若全图只有一个点双怎么做,你发现这个完全不会做,因为从来没有人教过你,对一个点双,有哪些特殊的处理办法。做图论题的时候,一般都是在利用特殊图的性质思考的:链、树、环、基环树、仙人掌、平面图、弦图、广义串并联图、二分图、欧拉图;以及有向图一族中的 dag、竞赛图。我不知道是否容易注意到,所谓的“序列图”至少是平面图,甚至比平面图还强。换句话说,原图具备一些比平面图还强的性质,才能有解。仿照 T-109 的想法,先把原图的性质刻画出来,然后充分利用这些性质。
具体有哪些性质呢?用子图添点。不妨把各个点双独立开来。对于一个点双,若是一个环显然合法。添一个耳,发现这个耳只能是一条边,而不是一条路径。同时,不允许两个耳“相交”。换句话说,一个点双形如一个“大环”上多连了一些互不相交的边。不过我更推荐“同胚”的思想。常见的一些特殊图的定义是用“不存在子图同胚于图 \(G'\)”来给出的,“同胚”的意思是,经过若干次缩二度点,可以使得两图完全相同。例如广义串并联图:不存在 \(K_4\);平面图:不存在 \(K_5,K_{3,3}\)。对于本问题,仍旧“子图添点”,假设“不准与之同胚”的图为 \(G'\),从三元环开始尝试,三元环本身是不够的。添点可得,合法点双不包含同胚于 \(K_4\) 的子图,这意味着每个点双都是广义串并联图。“子图添点”也可得,点双没有同胚于
A
/ \
B-C-D
\ /
E
的子图。这样,也能得到“点双形如一个‘大环’上多连了一些互不相交的边”的结论。
利用这个结论解题,关键在于找出“大环”,找出了以后就可以把图当仙人掌做了。刚才说了,点双是广义串并联图,不妨利用广义串并联图方法去找大环,而这恰恰是容易的。找出“大环”后,问题就分成三部分,一部分是圆点的决策(合并儿子方点),另一部分是方点的决策(圆点是顺时针排列还是逆时针),最后一部分是合并连通块。都比较简单,就不提了。
T-112 P11846 26-2-2 A+
若 \(a,b,c,d\) 均为正数。那么倒推(如何想到“倒推”?就跟“容斥掉限制”一样,是你要去试的。不过“终止状态确定”是一个提示),最后一步必然是 \(c,d\) 中较大者受到较小的贡献。似乎可以无限递归,这是类似于辗转相减法的一个过程。若全是负数,也做完了。剩下的几种情况,似乎要认真分类讨论。不过因为 \(a,b\) 和 \(c,d\) 具备对称性,所以没有那么多种,不妨强制限定 \(a>0,b<0\)。第一类,\(c>0,d<0\);第二类,\(c>0,d>0\);第三类,\(c<0,d>0\)。
第三类是不可能的,因为在变化的过程中,必然是 \(a,b\) 中的某个,先和 \(c\) 或 \(d\) 变得同号,这样一来 \(a,b\) 中的另一个就没机会了。接下来尝试化归(如果解决了原问题的某些特殊情况,不妨尝试把其它情况化归过来,这也是要去尝试的,没有什么明显的信号在题目中)。对于第一类,令 \(b'=-b,d'=-d\),则问题和 \((c,d')\to(a,b')\) 完全相同(不妨写出所有可能的转移,并进行对照),直接化归。对于第二类,似乎无法直接化归。考虑变化的过程,当 \(a,b\) 同时变为负数,则无解。而一旦 \(a,b\) 同为正数之后,直接计算答案就行了。因此我们好奇的是,\((a,b)\) 通过几次操作,能够得到怎样的 \((a',b')\) 均为正数。
若 \(|a|>|b|\),则边界情况的转移,也即第一次转移,有 \((a,a+b)\) 这是一对正数。如果不这样,只能是转移向了 \((a+b,b)\),若此时 \(|a+b|>|b|\),则还跟刚才一样。这样能够得到的是 \((a+kb,a+(k+1)b)\) 这些对。一旦发现新的 \(|a|<|b|\),就只好向 \((a,a+b)\) 转移,直到 \(|a|>|b|\) 再次成立,然后又得重复刚才的过程。由辗转相除法的结论,这可以暴力递归做。这样一来,合法的 \((a',b')\) 正数对恰好被分为 \(O(\log V)\) 段 \((a_i+kb_i,a_i+(k+1)b_i)\)。
但是不能暴力对每一“正数对”都做计算。不妨改换贡献主体,以 \((c,d)\) 为主体,计算它对“每一对”的贡献。换句话说,从 \((c,d)\) 倒推回去,因为 \((c,d)\) 的辗转相减过程本身就是 \(O(\log V)\) 段直线在构成中间状态。所以只需枚举一对直线段,那它们至多有一个交点,可计算此交点对应“正数对”的答案。总复杂度 \(O(\log^2 V)\)。
我对上面所谓的“分析变化的过程”作一点解释。因为变化的过程十分复杂,我不能说考虑每一时刻的 \((a,b)\) 具体是什么。所以退而求其次,只关注一些与 \(a,b\) 有关的关键信息,而非全部信息。这就很类似于势能法的思想:关注元素本身比较复杂,转而关心数量关系。在本题中,值得注意的就是 \(a,b\) 前的符号,或许还有 \(|a|,|b|\) 二者的大小关系。“考虑过程”似乎还常常关心“里程碑式”的事件是否被达成了,我后面再多做些题,再认真分析。
T-113 一些网格图题目 26-3-12 B+
- 孩子们我回来了,博客复更。这几天先把前些时候做过的题目整理了。
我们往往建立对偶图,用于转化网格图问题。同时,网格图欧拉定理也应该牢记。
T-113-1 P7295
求矩形范围内的连通块个数。这还是个平面图,可利用欧拉定理,\(K=V-E+R-1\),四个字母依次代表连通块数,顶点数,边数,区域数(平面图的边把原图划分成了多少个区域,建立对偶图的时候,就是对每个区域建一个点)。这些信息大致满足可减性,直接做前缀和-差分即可。但是注意“区域数”实际有两种情况,第一种是形如 2*2 的同色小方块,而第二种是同色连通块将另几种颜色的连通块围起来了。第一种可直接做,但第二种怎么办?
枚举“围别人”的颜色是什么,将其它颜色视作平地做八联通 dfs,可得所有“区域”。接下来计算被询问矩形包含的区域数,要求完全包含,所以该“区域”“四至点”所拓展出的矩形应被整个包含,这是无法降维的四维偏序问题。当然可以 cdq 套 cdq 做到 \(O(nm\log^3 nm)\)。也可 bitset 做,也就是说维护 \(B_{i,x}\) 表示第 \(i\) 维比元素 \(x\) 要小的元素的 bitset,每次给它们求与并做 count 就行了,在本题似乎复杂度过高。
当然,四维偏序也可分块处理。扫描一维,分块第二维,块内维护第三、四维。本来,因为一个块内要维护两个维度,还必须在线查询,所以必须带树套树的 \(O(\log^2(\sqrt n))\) 作为单次查询/询问的复杂度,要么就得上 kdt。我一再强调,我说分块和 log 不搭,而且修改仅 \(O(n)\) 次但查询共计 \(O(n\sqrt n)\) 次。所以把树套树改成二维值域分块,要求做到修改 \(O(\sqrt n)\),查询 \(O(1)\),这是能办到的。
T-113-2 ARC214F
因为不允许连续往同一方向移动,难以直接建图。改一手主体,对“一次移动”建点,也就是对原图边建“点”,对相互垂直的邻原图边建“边”。如果一条原图边连接的两个格子中没有障碍物,则该边不能建“点”。转化为左上角到右下角(额外建立几个虚点)的网格无向图上连通性问题。
我们知道,网格图上连通性问题,常常转化为障碍物路径问题。所以要考虑怎样的两个障碍物之间能连“边”(有了边,才能讨论路径),换句话说,要找出“障碍物构成的路径”中“相邻障碍物”的性质。方法是,枚举这两个障碍物的相对位置,并想象按照网格图边,从此两个障碍物的“中间”穿过(取两个障碍物的重心;连接,取连线中点;假设你站在连线中点周围的某网格图点上,看你能否按照近似于“垂直连线”的方向,从两个障碍物间穿过)。如果不能,那么这两个障碍物可以视作建立了边。本题中,将曼哈顿距离小于等于二的障碍物间连边,则若存在一条从网格左下边界上任一点出发,到右上边界任一点终止的障碍路径,网格图就不连通。
题目要求删除障碍物使得不存在上述路径。建立障碍物图后,运用最小割的“无路径”模型处理即可。
T-113-3 P15246
本题有两个轴,分别是时间和位置。在二维平面上考虑,则一只猫形如一条斜率为正负一的线段,杰瑞的行动轨迹为一条斜率为正负一的折线(调整可得)。假设允许 \(O(n^2)\) 建图,则将所有猫线段端点的横纵坐标分别离散化,可分别得 \(O(n)\) 个横、纵关键坐标,从而得 \(O(n^2)\) 个关键二维坐标,调整可得杰瑞必然在这个网格图上行走,从某一列 \(t=0\) 上任一点出发,到列 \(t=t_{\mathrm{final}}\) 上任一点终止,每步只准向左或向下行走(表述不准确,就是在说,每个网格节点处只有两种决策,网格图是个 dag)。
题目强调,杰瑞有十条命。假设它只有一条命,考虑若已知玩家选择的猫集合,如何判定杰瑞会不会死。将猫线段涉及的节点视作“不可通过”,则问题等价于原图不连通。若杰瑞有十条命,显然玩家选择猫集合的合法条件是,这些猫组成了十道“防线”,任一只猫不被两道防线共用(原题指出,猫和杰瑞碰面一次后,猫就会消失),每道防线都能使原图不连通。
注意到原图是个网格图,询问其上的连通性相关问题,而且数据范围暗示网络流。不妨尝试将一道“猫防线”中的相邻猫建边,使得一道“猫防线”就是一条“猫路径”。按照我教你的方法,容易写出两只猫建边的条件,这就可以建图了。限制流量为 \(k\) 跑最小费用流即可。
两只猫建边的条件比较特殊,是一个二维偏序的形式,可以主席树优化建图。这还是过不了,改成原始对偶算法跑网络流就行了。
T-114 QOJ7340 26-3-12 B+
原题要找出字符串 p,q,r,s 满足 pq,rs,ps,rq 都在字典中出现过。取字典内一个字符串为主体,看它的作用。它的作用形如“若 \(p=\mathrm{pre}_i\) 则 \(q,s\) 之一可以等于 \(\mathrm{suf}_{i+1}\)”。这限制比较复杂,不妨建图。将每个前后缀建点(哈希值相同的两个前缀需要并点,后缀亦然),\(\mathrm{pre}_i,\mathrm{suf}_{i+1}\) 建边,则问题等价于找出一个四元环。
任意图三元环/四元环计数是经典问题,能做到 \(O(m\sqrt m)\) 的,方法如下:枚举四元环上第一个点 \(a\),再枚举与之相邻的两点 \(b,c\)(要求 \(a\) 的度数比 \(b,c\) 大),再分别遍历 \(b,c\) 的邻域,即可找出同在 \(b,c\) 邻域中的点 \(d\),则 \(abcd\) 是四元环。为什么复杂度对呢?对于一个 \(u\),其作为 \(b\) 被枚举至多 \(\min(\mathrm{deg}_u,\#i:\mathrm{deg}_i>\mathrm{deg}_u)\) 次(有两个条件:\(a\) 在 \(b\) 邻域里,\(a\) 比 \(b\) 度数大。两个集合的交集大小,一定小于任一集合的大小,这是通用的一个放缩。),被枚举到一次,则需遍历邻域,复杂度 \(O(\mathrm{deg}_u)\)。考虑到若 \(\mathrm{deg}_u>\sqrt m\),则 min 中后项小于根号;若它小于根号,则 min 中前项小于根号。所以 min 必然小于根号,总复杂度小于 \(O(m\sqrt m)\)。只需在统计时精细实现一下,即可不算重(我讲过,去重的方法有三种,一个是容斥,一个是在已知每个方案被算重多少次的情况下可允许算重然后统一做除法,还有一个是钦定某种字典序使得只有字典序最小的计算方式将方案计入。本题中选择第三种方法比较合适,对于一个四元环,只有至多两种计算方式将其计入,设第一种方式枚举的点分别是 \(xyzw\),其中 \(a=x,b=y,c=z,d=w\),则第二种方式应为 \(a=w,b=y,c=z,d=x\)。不妨按照 \(a\) 节点编号比较字典序。也就是钦定,计算时满足 \(a<d\) 的方案计入答案)。一般图三元环计数和这个一样,就不提了。若会计数,也就会输出一组方案嘛。
T-115 P12768 26-3-13 B
注意到本图是一个竞赛图。那么强连通分量缩点后是一条链。使用兰道定理,求出每个点的度数并以此排序,就能求出每个强连通分量了,而求度数是容易的。
T-116 一些广义串并联图题目 26-3-13 S
真正意义上的广义串并联图,通过“删一度点/缩二度点/删除自环/叠合重边”操作,可以缩成一个点。在缩合过程中,常常令一个缩合而成的点,其点权代表“它代表的原子图的某些信息”。这种办法还可用于 \(m-n\) 很小的一类图,经过广义串并联图方法处理后,这类图的点、边数都会极小。
广义上的广义串并联图方法,就是指不断缩合、删除点或边,来达到简化图的目的,原图不拘泥于无向图,缩合删点方式也有所不同。它和某类构造问题的通用解法很相似,都是要你把“已知的东西/不减少问题可能性(没用)的东西”直接变现。可以尝试从度数等数量关系,以及边界元素出发去考虑“怎样的点应该被删除/缩合”。换句话说,因为它的度数小,小到你足以看出它没用,或者小到它的用途能够被你一眼看出的时候,这个点就该被删了。
T-116-1 P10790
把对一类点的限制翻译成:从此点开始引某个 dfs 树,不存在前向边和横叉边。若已知一个一类点,那我只需套路地建出以此点为根的任一 dfs 树,并加以适当思考,就会做了,不在本文讨论范围内。关键是如何找到一个一类点,下称这个点为“合法根”。
首先,原图强连通分量缩点以后,一定有一个“入度”为零的分量,候选根只能属于这个分量。我再重复强调一遍:最优化问题,可以考虑若已知一种描述法,算权值是否容易、如何算权值。与之类似,涉及到合法性判定的问题,可以考虑若已知一种描述法,判合法性是否容易、如何判断合法性。本题中,是要判定根的合法性。回忆:若能找出一个以它为根的 dfs 树,没有横叉边和前向边,则根合法。
改描述法,以 dfs 树为主体,问题转化为找出一个合法 dfs 树(本来是存在性问题,枚举答案后化为判定性问题,这判定性问题本质上是另一个存在性问题)。图论问题有三种常见方法:生成树/缩点/广义串并联图方法,本题已经应用了前两种,现应该尝试最后一种。我刚才说,要找出实际上不减小可能性(不言自明)、但能直接变现的东西,而且尽量和度数牵扯上。本题是有向图,不妨枚举度数较小的几种情形,例如入度为一、出度为一等。不妨设某入度为一的点为 \(u\),向它连边的是 \(v\)。如此一来,要么 \(u\) 是合法根,要么 \(u\) 的 dfs 树上父亲必为 \(v\)。我想干的事情肯定是不断删除入度为一的节点,并把它和钦定父亲合并起来,一直做到不能做为止。你注意,我在没有删完/缩完之前,不能知道整个图的全部信息,这个时候不能下“某点是/不是合法根”的论断。换句话说你如果决定要删/缩哪个点,那它一定不是合法根,或者一定“可以不是”合法根;或者你有某种手段,有办法维护所有“可能是合法根”且“被合并掉”的点,把它们一直保留到最后统一判断,但这种情况非常麻烦,不太好做,也就不太可能。我刚才说,\(u\) 虽可能是合法根,但只要明确它“可以不是”合法根,那本做法的正确性就能保证。换句话说,若 \(u\) 真是合法根,只要能找出另一合法根即可。注意到若 \(u\) 合法则 \(v\) 必合法,而且具备传导关系。
综上,每次删除入度为一的节点,把它和钦定父亲合并起来,直到删不动为止。此时点的度数,非零即大于等于二。如果有多个入度为零的点,那必然无解(我都说了,广义串并联图方法没有损失 dfs 树的可能性,所以缩合前后,问题等价。而转化后的问题,是无解的,所以原问题无解)。如果恰有一个入度为零的点,那它就是解;如果全是入度大于等于二的点,那看上去也不太有解,证一下:反证法,若有解,画出解 dfs 树(是缩后图的一个 dfs 生成树),则它必只有返祖边。考虑边界元素叶子,叶子的入度必是一,这与假设矛盾。不太严谨,但差不多就是这样。
T-116-2 P8276
首先有一个状态 \(O(n^2)\) 的 dp。考察如何用广义串并联图方法缩减状态/转移。你看啊,能够变现的有哪些呢?稍微枚举一下,入度为零行不行?出度为零行不行?入度为一行不行?出度为一行不行?注意到出度为一的点,如果有人站在这点上,则未来的决策只有一种可能,因此应该缩合;出度为零的节点,如果有人站在这点上则“脑”一定取胜,因此应该删除。这样处理完毕后,每个点的出度都大于等于二。考虑两个人分别被缩合到了哪个缩后点,如果二者相同,则脑必胜;反之,尝试证明蹄必胜,注意到一个人只能堵住一个出口,不妨 dp,你会发现没有脑必胜的初始态,因此蹄必胜。
在此顺便总结一下,解决图论题目的要点。第一是找出题目图的特殊性质(题图是不是:树/仙人掌/dag/竞赛图/平面图/广义串并联图/弦图等等;题图经过缩点处理后,一个分量内部是否具备良好性质,考察一个分量内部的性质,可以利用耳分解-子图添点方法),第二是尝试缩点,第三是利用生成树,第四是采取广义的广义串并联图方法,第五是采用数量关系(点数/边数/度数)来关心图的状态,第六是尝试归纳(按照某种顺序逐渐添点和边,或者逐渐删点和边,递归成规模恰好小一的子问题)。
T-117 P15363 弱化版 26-3-13 A
弱化:\(w_i=0\)。
如果每个人有一个出发地和一个目的地,问能不能移动他们。对此一般的做法是,将人们视作同等的,维护“有人的位置”构成的集合,这个集合初始时为出发地集合,最终应为目的地集合。那么问题分为两部分:第一个,能否令“有人位置集合”从初始状态变化到末尾状态?第二个,人们的相对顺序能否处理,而这常常需要考察,哪些对人能互换位置。
本题的部分分 sub5 即初始和末尾集合相同,只需考察怎样的一对人能够互换位置。不妨检测 \(a,b\) 两个人。若 \(a\) 能到达 \(b\) 则显然可以。你在分析一个困难问题时,一定要知道自己已知什么,有哪些决策是显而易见的,有哪些东西是已经隐含确定的,有哪些决策是必须进行/没其它选择的。把这些情况都讨论清楚了,就意味着你只关注“不落入上述任一种情况”的那些问题,这些问题也就很可能因此具备良好的性质,建议对比上述广义串并联图方法的两道题目阅读。回到本题,剩下的情况就是 \(a,b\) 互不可达。考察整个互换过程中两个人的路径,它们最好“可以是”(能调整成)简单路径,感受一下/证一下发现还真是。那么因为原本不可达,但最后怎么着还是可达了,这必然是因为走了另一个老哥的来时路,换句话说,两个人的路径的前后两段重叠,中间可能分叉又合拢。重点在于两个人能够在不改变边方向的前提下碰头,即其依原边的可达集合有交。两个人互换之后,边的方向较互换之前没有改变,故互换具备无序性,所以将可互换一对人连边,则连通块内人们可两两互换,这就做完了。
整道题,问能否从 \(s\) 集合变到 \(t\) 集合。注意这个边取反的操作在网络流里面见过,所以直接流就可以了,比较有趣。不过若存在 \(w_i=1\) 的边,请阅读洛谷题解,我尚未偷学怎么做。
T-118 一些模拟费用流题目 26-3-13 B+
求解最小费用最大流,总体上有两个办法。一个是“最值”式的,例如每次找出最短增广路进行增广,流量加一。另一个是“存在”式的,就是先找出任意一个满流的方案,然后每次选择一个负环进行流动,直到找不出负环为止,类似于调整法。因为原图比较简单,所以可以通过数据结构的方法,维护出最短增广路/负环。千万记得,一个增广路/负环可行的条件是其上的剩余流量都得不为零,必须用数据结构维护当前图中的这些剩余流量。最小费用最大流问题中,根据“最值”式解法容易推出,最小费用关于流量具备凸性。
无论“最值”还是“存在”,我们的首要目的是减少增广路/负环的类型,从而方便维护。因此常通过调整法,用增广路/负环“可以”不是你来缩减状态。就是证明:如果你是最短增广路,那么一定存在另一个更简单的、长度不劣的增广路;如果你是负增广路/负环,那一定有另一简单负增广路/负环。在此给出,应用这种调整法得到的初步结论:最短增广路不会多次经过同一个点;负增广路不会多次经过同一个点;负环一定可以是简单环。
有大量的题目,直接模拟最小费用最大流的求解过程,都难以维护数据结构/讨论清楚所有情况。这时候,就必须转化为最小费用任意流问题,然后可进一步转化成增量-最小费用任意流问题(运用图论归纳思想)。一般来说,增量-最小费用任意流问题更容易解决,也更常用。
最小费用任意流问题,就是不强制要求流量最多,允许流任意多,只要求总费用最少。解法仍有两个,一个是“最值”式,每次找出最短增广路,使得流量加一,直到该最短增广路的边权为正时终止;第二个是“存在”式,每次找出任一条负增广路或负环,并做流动,直到找不出为止。
增量-最小费用任意流问题,就是每次给图添点边,仍旧询问最小费用任意流。其解法是“存在”式的,每次只需考虑所有新的负增广路(它必须要经过新增的点/边)和新的负环,并做流动。
现在问题在于,如何把最小费用最大流转化为最小费用任意流。第一种办法是,给一些边权加上 -inf,使得每个流量都带上 -inf 的代价,使得最优流法必然是最大流;第二种办法是,如果最大流大小已知(存在限制源流量为 \(k\) 的限制),那么不妨做 wqs 二分(因为凸性),强制给一个流量带上 \(c\) 的额外代价,这样一来,就不用限制流量为 \(k\) 了。为什么要 wqs 二分,而不是选择第一种办法呢?因为某些负环/负增广路可能在“第一种办法直接建图”下显得合理,但在 wqs 二分后建立的图中(没有超源-源的 \(k\) 限制)就变得无用了。
T-118-1 P5470
对于本题,我们能感受出 dp 是没有前途的,作为一个最优化问题,次优选择就是贪心,能想到反悔贪心。那么既然判断本题是复杂反悔贪心(观察题位可知本题不太容易),可以先建立网络流模型,然后采取模拟费用流的办法,得到反悔贪心思路。
建图(比较容易,和洛谷题解区相同。建图的初始边权全是负的,跑最小费用最大流)。先试试直接用“最值”法模拟。称两个超级虚点左右分别为 \(p,q\);源汇点为 \(s,t\);左右部分点分别为 \(l_1...l_n,r_1...r_n\)。
注意,尽量减少增广路的种类数,如果有增广路“一定不是最短路/一定可以不是最短路”,就不用统计它了;增广路不经过重复点。枚举可能的增广路形态,用一个数据结构(一般是反悔贪心的堆)维护这些待考虑增广路的长度,每次在其中选择最优的行走。关注边界元素 \(s,t,p,q\)。从 \(s\) 开始,手动爆搜,逐步分讨:
s->l1->r1->t
s->l1->p->q->(r1 或 r2)->t
s->l1->r1->q->p->l2->r2->t
s->l1->p->l2->r2->t;s->l1->r1->q->r2->t
s->l1->p->l2->r2->q->(r3 或 r1)->t
翻译成调整法/反悔贪心策略。注意增广路成立的前提是对应边流量不为零,这就能翻译成原条件的限制(比较特殊的只有一条边 \(p\leftrightarrow q\) 上面的流量)。
新选 \(a_i,b_i\) 构成 L 对。权值 \(-a_i-b_i\)。
新选 \(a_i,b_j\) 构成非 L 配对。消耗一次 \(p\to q\) 机会。
\(b_i,a_j\) 都被选了但 \(a_i,b_j\) 未被选。现选择 \(a_i,b_j\),放弃 \(b_i,a_j\) 的非 L 配对,改为 \((a_i,b_i),(a_j,b_j)\) 两组 L 对。新增一个 \(p\to q\) 机会。
二者仅举一例。\(a_j\) 被选但 \(b_j\) 未被选。现选择 \(a_i,b_j\),放弃 \(a_j\) 所在的非 L 配对,令 \(a_i\) 顶替它的位置;新增 \(a_j,b_j\) 一组 L 对。
这种增广路实际不优。
这些策略用几个堆维护一下就行。
T-118-2 P4694
这是最优化问题,dp 是没前途的,不妨尝试反悔贪心,建立费用流模型。也就是 \(s\to i,i\to i+1,i\to t\),限制源流量 \(k\),求最小费用最大流。
法一,用“最值”法模拟,每次找出最短增广路。因为不经过重复点,所以这种增广路的形态只有:选某个 \(a_i\),顺行或逆行,选某个 \(b_j\)。其中顺行是永久允许的;但逆行存在“中间流量不为零”的限制,这要求我们至少动态维护每条“中间反向边”的当前流量。顺行和逆行可分别求解,这是两个单答案数据结构问题。
单答案数据结构问题被我长期忽视,对它的总结,也不如对范围查询问题的。不过,我的总结没有一蹴而就的,都要经过多道题目的检验,并据实际情况作扩充和修正。我一时想不太全面、也不完全了解单答案问题的一般解决办法,但我可以先说一说我现在已知的,以后再见题,再扩充。首先,常规办法如改换主体、改换轴顺序、相邻元素合并统一求解/统一贡献,都是能用的。递推在此处似无用武之地。不过分析预处理、修改、查询“三步走”策略应该是有用的。如果查询是 \(O(1)\) 的,那大概率答案是从“堆/set 的顶部”“某个全局计数器”“线段树的根”直接输出。如果查询具备一定复杂度,可能我是要检查答案是否真的合法?可能我是合并分块信息?也未可知啊。

浙公网安备 33010602011771号