5月杂题

5.7以前

  1. gym101464C

考虑二分半径 \(R\),对每个线段处理出:圆心在什么范围会使得圆和线段相交。显然这个范围在 \(x\) 轴上是连续的。考虑找到任意一个在范围内的位置,二分两遍,求出左右端点即可。这个位置可以取线段上 \(x\) 轴最近的点。 最后对所有范围取并,看是否覆盖 \([0,L]\) 即可。

复杂度 \(O(n\log^2 V)\)

  1. CSES1685(随机化做法)

先把图缩成 DAG,设入度为 \(0\) 的是 \(a\) ,出度为 \(0\) 的是 \(b\) ,则答案为 \(\max(a,b)\)

需要构造方案。考虑对入度为 \(0\) 的点定义权值表示它能到达多少出度为 \(0\) 的点。对出度为 \(0\) 的点类似的定义。则在 \(a,b>1\) 时我们需要保证 \(u,v\) 的权值都大于 \(1\) ,且 \(u\) 能到达 \(v\)

但是我们无法快速找到。考虑一个随机化算法:

我们随机找一对 \(u,v\) ,合法的概率至少为 \(\frac{(a-1)(b-1)}{ab}\) ,这是好证的。
\(k=\frac{\min(a,b)}{2}\) ,则我们直接随 \(k\) 次,全部都合法的概率就至少是 \(\frac{(a-k)(b-k)}{ab}\geq \frac{1}{4}\) ,我们期望随 \(4\) 次即可。每次判断合法就是再次缩点,看新的 \(a,b\) 是否合法。这样搞 \(\log n\) 回即可,复杂度就是 \(O(n\log n)\)

  1. UOJ424

同构等同于笛卡尔树形态相同。对笛卡尔树 dp ,每次枚举根是哪个,这个树需要满足:最多能往右下走的步数要 \(\le m\) 。转移就是 \(f_{i,j}=\sum f_{k,j-1}f_{i-1-k,j}\) 。写成 GF 就是 \(F_j(x)=1+xF_{j-1}(x)F_j(x)\),需要求 \([x^n]F_m(x)\) 。注意到 \(F_j(x)=\frac{1}{1-xF_{j-1}(x)}\) 。如果我们把 \(F_j(x)\) 写成 \(\frac{A(x)}{B(x)}\) 的形式,则转移相当于是乘了一个矩阵。于是直接计算出矩阵的快速幂(这一部分似乎可以打表观察出结果),再求逆即可。因为矩阵内的多项式项数每次增倍,所以总复杂度是 \(O(n\log n)\) 的。

但事实上有更好的做法:考虑换一种角度:观察当前最右链的长度,则问题转化成了一种经典的格路计数,可以用翻折法解决。复杂度 \(O(n)\)

  1. QOJ2211

非常神秘。

先讲一个与正解无关的有趣的暴力:

考虑我们没有必要尝试枚举每一处断掉,只需要随 \(O(\frac{n}{k})\) 次就能包含答案,每次正常做,事实上可以直接 \(O(nk\log n)\) 算,复杂度 \(O(n^2\log n)\) ,能在模拟赛中取得 \(60\) 分。

现在首先考虑是链怎么做,显然 wqs 二分 + 决策单调性 即可,复杂度是 \(O(n\log ^2 n)\)

现在先当成链做,得到一组方案。可以发现,我们当前的决策点把环切成若干段,答案的决策点应在每一段各选一个,并且也具有决策单调性。(我不会证,比较感性)

找一段来分治,从而实现断环为链。设之长度为 \(z\) ,复杂度大概是 \(O(zk\log z+n\log n\log z)\) 。找到最小的 \(z\le \frac{n}{k}\) ,则复杂度为 \(O(n\log ^2 n)\)

5.7

做了什么:坐飞机,大吃大喝。

  1. P9139 [THUPC 2023 初赛] 喵了个喵 II:

先考虑每个出现两次怎么做,发现只要每对区间不是包含关系即可。

回到此题,相当于要把 4 个数分成两组,有 \(1-2,3-4\)\(1-3,2-4\) 两种选法。

2-SAT+主席树优化建图 即可。

5.8

做了什么:模拟赛,发的题,CF。

  1. LOJ6476 「ICPC World Finals 2017」复制,复制,复制并变异 Replicate Replicate Rfplicbte

考虑逆向思考,如何还原到操作前的状态,发现每次找到最后一行中最右的 \(1\) ,设其坐标为 \((x,y)\) ,则在 \((x-1,y-1)\) 放雷,并把周围的 3*3 反转一下。

这样消下去就会剩两行两列,我们发现由之可以直接推出关键点的坐标。

  1. LOJ511

处理字典序的过程是平凡的,问题可以转化成:每个点可选/不选,一些点只能选,一些点只能不选,求独立集个数,对 \(V=10^{18}\) 取 min。并且每次会改变一个点是否能选/不选的状态。

有两种做法,一种是直接传统 ddp。

这种做法非常麻烦,因为还要对每个点的轻儿子建线段树,处理不能除/减。

一种是利用答案和 \(V\) 取 min ,观察到自由点超过 \(2\log(V)\) 时直接输出 \(V\) ,否则暴力 dp。

  1. CF341E

考虑只有三个数怎么做,如果这个能玩出来这个题也就做完了。

\(a_x\le a_y\le a_z\) ,我们想用 \(a_x\)\(a_y\) 消的比 \(a_x\) 更小。

发现 \(z\) 的存在,可以使得每次 \(x\) 都翻倍。

\(a_y=a_xt+k(k<a_x)\) ,从小往大考虑 \(t\) 每一位,如果为 \(1\) 就操作 \((x,y)\) ,否则操作 \((x,z)\) 。显然 \(a_z\) 仍然 \(\geq a_x\)

  1. CF346E

发现把问题按照 \(0,a,2a,...,ka(ka<p)\) 分段,就构成了 \(p'=a,a'=a-p\bmod a\) 的子问题,递归做下去就好了.

  1. CF1827D

注意到把 \(j\) 从大往小枚举,\(g\) 会形如 \(O(n)\) 次区间加,然后利用 BIT 维护历史和即可。

  1. CF1827E

发现只要每个边两端都至少选了一个边就可以了。

考虑从小往大枚举 \(\min(A,C)\) ,将不合法的边的两端合并。然后如果一个块没有合法点且为叶子就删了,算答案就是在每个叶子取最大的合法点,再在剩下的点里尽量取更大的。

5.9

做了什么:改题,做发的题。

  1. CF1798F

一个结论:\(2n-1\) 个数里一定能找出 \(n\) 个,和是 \(n\) 的倍数。

由此,我们把集合大小从小往大排序,每次直接任取 \(2s-1\) 个剩余的数,做一遍背包构造方案。对于最后一个集合,再补上合适的数。

  1. LOJ3278「JOISC 2020 Day3」收获

发现对于每个人 \(u\),我们都能处理出:如果某个苹果树被 \(u\) 摘了,则下一个摘的人 \(f\) 是谁。由此可以连出一棵基环树。

每个苹果树能用二元组 \((u,t)\) 表示,意思是 \(u\) 第一个摘,是 \(t\) 时刻摘的。

对于树的贡献,相当于算子树内 \(t+d_u-d_f\le T\) 的二元组个数。二维偏序。

对于环的贡献,设 \(dis(u,v)\) 表示 \(u\) 顺着环走到 \(u\) 的时间,则有 \(T-t-dis(u,f)\) 除以 \(L\) 下取整再加 \(1\) 。可以拆成两遍偏序。

  1. gym102412D

首先可以用文艺平衡树维护序列,现在的难点在于合并信息。

发现如果已经有三元上升,就不需要准确维护信息。

通过讨论发现我们需要处理:一个子树中 \(>z\) 的最小数。因为没有三元上升,\(>z\) 的数一定单调递减,所以直接二分即可。因为平衡树树高 \(O(\log n)\) ,复杂度即为 \(O(n\log^2 n)\)

  1. gym102391E

处理最小直径,二分答案。可以对仙人掌建出圆方树。设 \(d_u\) 是使 \(u\) 子树合法的前提下,\(u\) 到最深叶子的距离最小值。dp 一下就好了。实现比较复杂:

就是我们断开的地方,左右分别维护三个信息: \(s,m_1,m_2\) 其中 \(m_1\) 是当前 \(u\) 到当前最深叶子的距离,\(m_2\) 是当前点 \(v\) 到其他点的最远距离, \(s\)\(u\)\(v\) 的距离。

5.10

做了什么:去 jzhx,听线性代数,模拟赛。

  1. CTT2019 D3T2

如果不是环是链,则操作等同于:求出前缀和数组 \(s\) ,交换 \(s\) 的相邻两项。就是求逆序对个数。

现在是环了,我们把原序列无限复制,并设定一个“零势能面”,类似的定义 \(s\) 。设原序列所有数的和是 \(A\) ,则 \(s_{i+n}=s_{i}+A\) 。我们把 \(s_{i},s_{i+n},s_{i+2n}...\) 看成一个系统,则操作等同于交换一对相邻系统的位置。对于两个系统,如果相对应的一对位置有 \(a>b\) ,\(a\)\(b\) 前,则我们需要操作 \(b-a\) 除以 \(A\) 上取整次。拆成两遍二维偏序来算就好了。

5.11

做了什么:去玄武湖玩,做发的题。

5.12

做了什么:模拟赛,改题,做发的题。

  1. P4482

把反串的 fail 树建出来,问题等同于找到最小的 \(x\) ,使得 \(x>l,dep[lca(t_x,t_l)]\geq r-x+1\)

考虑进行树链剖分,把问题转化成 \(\min(t_x,t_l)\geq r-x+1\) 的形式。

\(x\geq\max(l+1,r+1-t_l),t_x+x\geq r+1\) 。做一遍二维偏序就好了。

复杂度 \(O(n\log ^2 n)\)

  1. Codechef Push the Flow!

题意:仙人掌,支持单点修边权,询问两点间最大流。

先转成最小割,然后建出圆方树,令圆->方的边权是一个前缀 min + 后缀 min 的形式。

相当于要询问两点间最小值,树剖维护。

难点在于我们一次修改实际上会对方点连出的所有边造成影响。但我们只需要修其中的重边即可,然后其他的在跳轻边时直接算就好了。

复杂度 \(O(n\log^2 n)\)

  1. topcoder10727

把状态看成点,往外翻看成走左右儿子,往内翻看成走父亲,这个题就成了简单的计数题.

把起点/终点的 \(0-k\) 级祖先当成关键点,则由于每个点都存在左右儿子,我们只需要关心当且的点往上跳得到的第一个关键点 \(u\),以及步数 \(d\).转移是简单的,复杂度 \(O(n^3)\) .

  1. ABC300Ex

一种做法类似于常系数线性递推,求多项式取模,是很平凡的.

介绍一种在考场上写出来概率更大,常数更小的做法:

先考虑 \(f_n\) 怎么算.

考虑 \(f_n\) 可以表示成 \([x^n]\frac{F(x)}{G(x)}\) ,其中两个多项式都有 \(k\) 项.

我们把上下都乘上 \(Q(-x)\) ,则 \(Q(x)Q(-x)\) 是一个偶多项式,它的逆也是偶多项式.

那把 \(P(x)Q(-x)\) 拆成奇偶两部分,即 \(A(x)=\sum a_{2i}x^i,B(x)=\sum a_{2i+1}x^i\) ,然后 \(n\) 为偶用 \(A(x)\) ,\(n\) 为奇用 \(B(x)\) ,递归做下去.

回到这个题,在 \(n\) 为奇时用 \(A(x)+B(x)\) 就好啦.

5.13

干了什么:周末,摆烂,ucup 没报上名。

5.14

干了什么:摆烂,打 ARC。

  1. ARC160D

考虑怎么对序列操作最优:从左往右,先把 \(a_i\)\(k\) ,再对 \([i,i+k-1]\)\(a_i\)\(1\) ,最后 \(a_{n-k+2}\)\(a_n\) 都是 \(k\) 倍数即可。

那有了这个策略,就可以把贡献拆开了,写成生成函数是 \([x^{m/k}]\frac{(1-x^k)^{n+1-k}}{(1-x)^{2n+1-k}}\) ,直接算就好了。

  1. ARC160E

发现每个叶子都要用一次,于是我们按照叶子个数 \(S\) 的奇偶讨论.

\(S\) 为偶数时,把叶子按 dfn 排序,连 \((v_1,v_{S/2+1}),...,(v_{S/2},v_S)\) 即可,原因是如果删掉一个点分成至多三部分(度数<=3),而每部分往外都有至少一条边.

\(S\) 为奇树时,答案的下界是 \(\min w_i +\sum\limits_{d(x)=1} w_x\) .令 \(w\) 最小的是 \(r\) .

如果 \(r\) 是叶子,我们取一个非 \(r\) 的叶子 \(u\),先不把 \(u\) 当叶子做一遍 \(S\) 为偶数,再连 \((r,u)\) 即可.原因是类似的.

如果 \(r\) 非叶子,考虑以 \(r\) 为根,如果存在一个 \(r\) 的儿子,使得子树内有至少两个儿子,就取其中一个作为 \(u\),按照上面的方法连.

否则发现这个时候树的形态很简单,就是 \(r\) 下挂了三条链.剩下的讨论就不难了.

  1. ARC160F

一个结论,有用的操作至多 \(\frac{n(n-1)}{2}\) 次,证明待补。

然后就是一个有趣的 dp:考虑一个 \(p\) 能被排序,当且仅当:对于每个 \(x\) ,令 \(q_i=[p_i>x]\) ,则 \(q_i\) 能被排序。由此状压 dp 就好了。很有意思,感觉就是通过这种变换,使排列能当成是一个自动机的一条路径。

5.15

干了什么:模拟(考了三个原题加强),做昨晚 CF 。

  1. CF1827B2

先分析一个子段的答案:我们两次操作选的区间一定不交,否则并在一起更优。

于是答案是 \(n-1-\sum [\max(a_1,a_2,...,a_i)<\min(a_{i+1},a_{i+2},...,a_n)]\)

考虑所有子段的答案和,就是统计多少个 \(\max(a_l,..,a_x)<min(a_{x+1},..,a_r)\)

这里就不难了,枚举 \(max(a_l,..a_x)\) 的下标,算一算即可。

  1. CF1827D

先分析怎么找答案是什么。找到重心的最大子树,设大小为 \(m\) ,则答案为 \(n-2m\)

于是现在要维护重心位置和 \(m\) 。我们接上一个点后,先假装重心不变,则更新 \(m\) 是容易的。如果此时 \(2m>n\) ,则重心变了,新的重心和 \(m\) 都是能直接算的。就做完了。

  1. CF1827E

考虑两个点 \(u,v\) 不能两步走到的条件。设 \(S_x\) 是所有包含 \(x\) 的路径的点集并,则 \(S_u\)\(S_v\) 不交。而这相当于,我们能断掉一条边,使 \(S_u\) 整体在一棵子树, \(S_v\) 在另一棵。

如果枚举断掉的边 \(i\) ,考虑所有跨过 \(i\) 的路径,则需要两端分别找到一个点不被覆盖。显然我们会去找叶子,那一条路径就只会给它两个端点做贡献。

所以我们枚举叶子,把所有覆盖它的路径的并利用虚树求出来,做一个树上差分,即可知道每个边在两端的被覆盖叶子的数量。构造方案是简单的。

  1. CSES1685(线性做法)

考虑对图进行改造,使得答案不变且图更简单。发现我们对每个入度为 0 的 scc 保留一个出边,对出度为 0 的保留入边,答案是不变的。进一步,我们先从右部开始 dfs,给每个左部点找到一个 \(p_i\) 使得 \(i\) 能到达 \(p_i\) 。然后对于 \(p_i\ne p_j\) ,我们从 \(p_j\)\(i\) 连边,这样 \(p_i\) 变成 \(j\) ,且 \(p_j\)\(i\) 都消去了。所以最后我们能使得所有剩余的左部点的 \(p_i=V\) 相等。接下来,从左部开始 dfs ,对右部点类似的处理即可,注意需要保证 \(V\) 不被删去。

最后得到了一张很简单的图,随便连一下就好了。

这个做法可能需要特殊处理一下孤立点。

5.16

做了什么:自习。

  1. CF1819F

把串当成点,操作看成边,发现图具有分治结构,就在 trie 树上 dp 一下,具体就是记录全 A/B/C/D 的串两两之间的最短/长路径,从下往上算一下,最长/短环也是很好讨论的。

  1. ARC147F

考虑不等式是环状的,尝试找到问题的组合意义:一个 \(x+y+z+3\) 的环,三个人初始分别在 \(0,x+1,x+y+2\) ,每步选一个人往前走,走 \(n\) 步,两个人不能走到一起,求方案数的奇偶性。发现如果某时刻两个人走在一起,那从下一步开始,就有两种移动是相同的,可以抵消;也就是只能移动剩下那个人,那它到最后也是有至少两个人在一起的。也就是说,我们只需要用总方案减去终止状态中有至少两人重合的方案。就是 \(3^n-{A,B重合}-{B,C重合}-{A,C}重合+2{A,B,C}重合\)

等同于求 \(1+{A,B重合}+{B,C重合}+{A,C}重合\) ,不妨考虑 \(A,B\) 重合,相当于要求一个形如 \([x^a](\frac{1}{x}+1+x)^n\pmod {x^{s}-1}\) 的东西。我们知道 \((a+b+c)^2\) 在模 \(2\) 意义下就是 \(a^2+b^2+c^2\) ,所以可以把原式化成一些 \(\frac{1}{x^{2^k}}+1+x^{2^k}\) 乘起来的形式。

此时,如果 \(s\) 较小,就直接 dp,复杂度是 \(O(s\log n)\) 的;否则考虑枚举 \(a+ks\) ,利用数位 dp 求出 \([x^{a+ks}](\frac{1}{x}+1+x)^n\) ,复杂度是 \(O(\frac{n}{s}\log n)\) 。根号分治即可做到 \(O(\sqrt{n}\log n)\)

5.17

做了什么:打模拟赛。

  1. acmicpc 20798

考虑暴力该怎么写。一个 Boss 被杀,当且仅当:不是他的朋友的人中,有一个能在剩下的人中当 Boss 后存活下来。发现这其实和博弈论干的事是类似的:如果能到达的状态有至少一个输,则自己赢。我们把“会被杀”看成赢的状态,发现这个问题其实就是一般图博弈。

这个题就成板子题了。

  1. QOJ6308

考虑 \(b_i=[a_{i-1}\ne a_{i}]\) ,则相当于是把 \(b_{l_i},b_{r_i}\) 赋成 \(1\)\(l_i<x<r_i\)\(b_x\) 赋成 \(0\)

如果存在一对 \(l_i<l_j<r_i<r_j\) ,则显然最后 \(b_{l_j}\)\(b_{r_i}\) 不能同时为 \(1\) 。这就转化成了一个最大匹配问题。主席树优化建图即可。

5.18

做了什么:摆烂!

5.19

做了什么:摆烂,听课。

  1. UOJ772

考虑一个暴力做法:把模式串的 ACAM 建出来,对于每个文本串,把每个前缀匹配到的点的虚树求出来,然后从下往上合并即可。注意我们的 fail 树只保留 作为一个串的末尾 的串。

这个复杂度是:所有文本串匹配到不同模式串个数之和。

其实这是 \(O(n^{\frac{4}{3}})\) 的。一个性质是,长度相等的模式串共出现 \(O(n)\) 次。 \(\le n^{\frac{1}{3}}\) 的模式串就是 \(O(n^{\frac{4}{3}})\) 的;对于 \(>n^{\frac{1}{3}}\) 的串,因为能产生贡献的模式串/文本串个数都是 \(n^{\frac{2}{3}}\) 级别,所以总贡献也是 \(O(n^{\frac{4}{3}})\)

事实上还能更优,做到 \(O(n\sqrt{\log n})\) ,其实就是,我们遍历整个虚树是多余的,把它拆成一条条链处理,把出现次数相同拉到一起算贡献。

  1. LOJ3396

考虑建出 AC 自动机处理问题.我们维护 \(z_l\) 表示当前 \(h(l,r)\) 的值,则 \(r\) 增加时,考虑怎么维护 \(z\)

\(f=fail_{p_r}\)

发现如果 \(r-l+1\le |f|\) ,我们就暂时不需要维护 \(z_l\) ,直接取 \(f\) 的答案。否则 \(z_l\) 会增加 \(s_f\) ,其中 \(s_f\)\(f\) 到根的所有点权值和。

我们只需要维护 \(l\le r-|f|\)\(z_l\) ,而 \(r-|f|\) 单调不减。所以每次我们会添加一段 \(z\) ,考虑这个怎么快速算初始值。

发现 \((r-|f|,r]\) 对应了某个串的前缀,而我们每次会往前添加一个字符并计算 \(h\)

\((r-|f|,r|\)\(h\) 是能预处理的;把反串的 AC 自动机建出来,找出正串每个节点会匹配到哪个点,就可以做这个添字符的过程,更新 \(h\) 了。

维护 \((l,z_l)\) 的上凸包处理询问即可。

  1. nowcoder 33189F

题意:树,边权为字符,多次询问两点间字符串的 PAM 大小。

做法:这种树上的串一般是把串拆断。考虑树分块。把串拆成 u-关键点1-关键点2-v,枚举关键点 1 来 dfs,在每个关键点 2 离线处理询问,相当于要可撤销,可双端插入的 PAM。这其实不难捏,双端插入和一端插入的区别就是特判整个串为回文。

  1. Petrozavodsk Summer-2015. Moscow IPT Contest H

咕。

  1. uoj697

基本子串结构练习题。分成三个部分统计答案,一个是块内的,一个是块下的,一个是块右的。

把反串的 SAM 也建出来能大量减少码量!

  1. QOJ6301

咕。

5.20

做了什么:APIO 打银了。

  1. APIO2023 T2

考虑枚举权值,把 \(>x\) 的设为 \(1\)\(<x\) 的设为 \(-1\)\(=x\) 的设为 \(0\) 来求出前缀和 \(s_i\)

\(p(l,r)\)\(s_l\)\(s_r\) 构成的集合,显然这是一个区间。

我们相当于要找两个 \(0\) ,使得 \(p(0,t_i)\) 往两头扩大 \(j-i+1\) 后与 \(p(t_j,n)\) 有交。让 \(j-i+1\) 最大。

从小往大枚举,则 \(p\) 可用线段树求,求完了就转化成一个二维偏序,BIT 解决。

  1. CF1817F Entangled Substrings

基本子串结构模板题。把结构建出来后求一个前缀和就好了。

5.21

做了什么:润了,因为要会考捏。自己看课件,补一道是一道。

  1. QOJ5526

先判掉整个序列逆序对为奇数,这个相当于,一开始是 n-环数,每次操作都会改变。

再判掉删掉一个数使得奇偶性改变,这个只需要看 \(i-p_i\) 就行了,画个图就知道了。

此时如果存在 \(p_u>p_v\) 答案就是 \(n-2\) ,否则是 \(-1\)

5.22及以后

  1. topcoder 14379

神题!考虑石头剪刀布是一种模 3 相关的问题,于是我们考虑单位根。

把串看成多项式,即 \(\sum c_ix^i\) 。令 \(A(x)\)\(R=w^0,P=w^1,S=w^2\) ,\(B(x)\)\(S=w^0,P=w^1,R=w^2\) ,则我们发现问题等同于 \(A(x)\)\(B_R(x)\) 做循环卷积后每一项系数都相等。

这似乎不太好处理,我们施加 DFT 来看看性质:我们要让 \(\operatorname{IDFT}(\operatorname{DFT}(A(x))\cdot \operatorname{DFT}(B_R(x)))\) 每一项系数相等,而 IDFT 本质上也是在做 DFT 。

所以我们需要 \(\operatorname{DFT}(A(x))\cdot \operatorname{DFT}(B_R(x))\) 除了常数项都是 \(0\)。那现在每个多项式就可以用二进制数来表示,合法等同于 \(A(x)\)\(B_R(x)\) 代表的数不交。

有结论:对于相同的串,\(A(x)\)\(B_R(x)\) 表示出的二进制数是相同的。

考察 \(\operatorname{DFT}(B_R(x))=\sum\limits_{j=0}^{k-1} x^j\sum\limits_{i=0}^{k-1}a_{i}^{-1}W_{k}^{(k-1-i)j}=\sum\limits_{j=0}^{k-1} x^jW_{k}^{-j}\sum\limits_{i=0}^{k-1}(a_{i}W_{k}^i)^{-1}\)

注意到 \(a_iW_{k}^i\) 模长为 \(1\) ,所以它的共轭等于倒数。

所以上面的式子等于 \(\sum\limits_{j=0}^{k-1} x^jW_{k}^{-j}\overline{\sum\limits_{i=0}^{k-1}a_{i}W_{k}^i}\)

对比 \(A(x)=\sum\limits_{j=0}^{k-1} x^j \sum\limits_{i=0}^{k-1}a_{i}W_{k}^i\) ,不难证明结论。

最后问题就成了:\(n\) 个二进制数,取一个子集使得所有数两两不交,状压 dp 即可。复杂度 \(O(3^m+nm^2)\)

  1. LOJ2398

先讲一下自己的垃圾做法:随一个点 \(u\) 当重心,通过枚举得到与它相邻的点 \(v\),对于剩下的点,枚举每个 \(v\) 来判断这个点是否在 \(v\) 子树内,这个可以断掉 \(v\) 来判和 \(u\) 是否连通。得到每个子树的点集后递归做下去。

相当于是在点分治。期望 \(8n\log n\) ,过不去,而且只能做树。

做法:

考虑维护一个点集 \(S\),一开始只有 \(0\) ,我们每次找到一个与点集相邻的点 \(u\) ,然后把 \(u\)\(S\) 间的边找出来,再把 \(u\) 加进去。

先说怎么找边:考虑把 \(S\) 内的 dfs 树处理出来,按 dfn 序把点记下来,二分出一个最小的前缀,使得保留这些点,\(u\) 能与根连通。这样就找出一个相邻的 \(v\)。删掉 \(v\) ,对每个连通块递归做下去。

这一部分复杂度大概是 \(O(m(6+\log n))\) 的,这个递归的过程相当于是一棵六叉树,每个非叶子要二分一次,叶子也要问一次。

接下来处理找 \(u\) :如果 \(u\)\(S\) 直接有边就返回;否则,我们任意找一个 \(v\) ,使得 \(v\)\(u\)\(S\) 的某条路径上,递归做下去,注意做的时候要删掉 \(u\)。找这个 \(v\) 也可以二分。

这相当于 dfs 一棵树的过程,是 \(O(n\log n)\) 的。

  1. LOJ3524

首先有一个暴力,就是 \(n\) 次 bfs,把 \(f_x\) 都求出来。

我们只需要找出最小值是哪些点,所以如果 \(x\) 能走到 \(y\) ,那 \(f_x\geq f_y\) ,计算 \(f_x\) 就没有意义了,我们把 \(x\)\(y\) 合并,最后判断 \(y\) 能否走到 \(x\) 就行了。

类似于 Borvuka,我们做 \(O(\log n)\) 轮,每次从一个连通块的根出发 bfs ,如果 bfs 到其他连通块就直接返回,然后合并一遍。

最后再对于每个连通块从根 dfs 一遍,计算 \(f_{rt}\) 并观察 \(rt\) 能否到 \(x\) 就行了,复杂度 \(O(n\log n)\)

  1. ARC161E

很神秘,就是说随机一个答案,正确率是很高的,证明似乎很复杂,咕。

现在就是怎么 check 答案。比方说一个 \(C_x=0\) ,那我们要求对于它两个相邻的点 \(v_1,v_2\) ,如果 \(a_{v_1}=1\) 那么 \(a_{v_2}\) 必须是 \(0\)

由此 2SAT 就好了。复杂度 \(O(An)\)

  1. ARC161F

check 所有子图密度 \(\le D\) 是简单的:

一个子集不合法:边数大于点数的 \(D\) 倍。

把这个套到 Hall 定理上,我们建一个二分图,其中左端点表示原图的边,右端点表示原图的点,原图的边往原图的两个端点连边,源点到每个左部点流量是 \(1\),每个右部点到汇点流量是 \(D\) ,判断能不能满流即可。

现在要判断是否不存在一个真子图的密度 \(=D\)

我们把这个无向图定向。在这上面跑出匹配后,如果一个边 \((u,v)\) 流向 \(u\) ,就从 \(u\)\(v\) 连边,否则从 \(v\)\(u\) 连边。

条件合法的充要条件:得到的图是 SCC。

先证必要:如果不是 SCC ,考虑缩点后出度为 \(0\) 的 SCC。我们知道,每个点 \(u\) 都会往外连 \(d\) 条有向边,且由于出度为 \(0\) ,这些边都在 SCC 内部,显然密度 \(\geq d\),不合法了。

再证充分:如果存在一个子图密度是 \(D\) ,因为所有点总出度是 \(d|S|\) 且已有 \(d|S|\) 条边,这个子图就不会对外有出边。

跑一遍 tarjan 就好了。最后总复杂度 \(O((nd)^{1.5})\)

posted @ 2023-05-11 16:59  grass8woc  阅读(291)  评论(1编辑  收藏  举报