广东省队集训

高二老登首次参加省集,大为震撼。

47.107.164.103

下面摘取一些收获。

day 1

是宇宙队长 l_l 的计数专题。

  • ARC165E 核心:“无法操作即跳过”,也就是在等概率的情况下,对于所有操作合法的操作序列,和所有的操作不一定合法的操作序列,遇到非法操作即跳过在组合上是一致的。从删点问题:合法操作序列集合难以表达,可以枚举操作排列,遇到非法即跳过

  • QOJ9798:核心:填数问题压复杂度

    问题:要求对于所有上界不超过 \(m\) 的长为 \(n\) 的不降序列,其选出子序列和为 \(s\) 的方案数。

    一个角度是:\(dp_{i,j,k}\),填了 \(i\) 个,现在的限制是 \(j\),选入的值和为 \(k\)。转移就考虑 \(j\to j-1\) 或者 \(i\to i+1\)\(O(nV^2)\)

    一个角度是记录填数个数 \(dp_{i,j,k}\):填了 \(i\) 个,当前选出 \(j\) 个,和为 \(k\),转移考虑新开一个 \(1\) 或者给所有数字加上 \(1\)\(O(n^2V)\)

    考虑对于 \(val>B\) 的值,用第二个 dp,新开的时候直接开 \(B\),对于 \(val\le B\) 的值用第一个 dp。复杂度 \(O(\frac{n^2V}{B}+nVB)\)

  • ARC148E

    1. \(a_i+a_{i+1}\ge K\),将数字分为 \(2x<K\)\(2x\ge K\) 两类,拎清楚限制。
    2. 插入法计数:记录当前序列中有多少个间隙可以插入。
  • P11346

    优化dp:\(dp_{l,r,k}\) 当前决策集合已经扩展到 $[l,r] $,并且内部操作了 \(k\) 个区间。

    每次考虑再操作一个内部区间(不扩张),或者扩展 \([l,r]\),增加内部区间的个数。

    如何优化?考虑拿出扩张序列 \((l_1,r_1)\to (l_2,r_2)\to (l_3,r_3)\to \dots\)

    每次扩张后,解锁 $cnt_{l_i,r_i}-cnt_{l_{i-1},r_{i-1}} $ 的操作权限。

    将解锁关系连边,即 \((l_{i-1},r_{i-1})\) 向新增的所有区间连边,特殊地,将导致扩张的那个区间设为 \((l_i,r_i)\) 而非其原本区间。

    将这个 dp 的总流程拿出来,会发现是在计数这一颗树的 dfs 序。

    \((l_2,r_2)\) 下面挂 $cnt_{l_2,r_2}-cnt_{l_1,r_1}-1 $ 个叶子以及点 \((l_2,r_2)\)

    \((l_3,r_3)\) 下面挂 \(cnt_{l_3,r_3}-cnt_{l_2,r_2}-1\) 个叶子以及点 \((l_3,r_3)\)

    \(\dots\)

    \((l_i,r_i)\)\(siz_i=n-cnt_{l_i,r_i}\)

    即,可以优化为只记录 \(dp_{l,r}\),每次扩展到 \(l_i,r_i\),就除以 \(n-cnt_{l_{i-1},r_{i-1}}\)(子树大小)

  • AGC020F

    实数难以处理,考虑拆分为整数,枚举小数部分相对关系 \((n-1) !\),这样就将整个部分划分为了 \(nV\) 个点。

  • CF 1844 H

    一堆恒等式的不断推导,最后借助简单结论对答案进行维护。

    \(f(a,b,c)\)

    • \(f(a,b,c)=(a+b+c)^{\underline{a}}f(0,b,c)\)
    • \(g(b,c)=f(0,b,c)\)
    • \(g(b,c)=(b-1)g(b-2,c+1)+cf(1,b-1,c-1)\)
    • \(g(b,c)=(c-1)g(b+1,c-2)+bf(1,b-1,c-1)\)

    推导出 \(g(b,c),g(b+1,c+1)\) 关于 \(g(b-1,c+2)\)\(g(b+2,c-1)\) 的恒等式。

    由此,考虑求出 \(g(b-1,c+2)\),再得到 \(g(b,c+3)\),最后拿出 \(g(b+2,c+2)\)

day 2

喜闻乐见模拟赛。

T1 想到欧拉回路就没什么难度。不重复使用边——欧拉回路

T2 难度在于从信息论角度考虑,以及第一步要意识到是 \(u\) 个一次还没错过,\(v\) 个已经错过一次,正确答案回答错误次数最多为 \(1\) 次。

意识到这个后其实就可以暴力打表了,设从 \(u\) 个里取 \(x\) 个和从 \(v\) 个里取 \(y\) 个得到的新状态,枚举回答结果转移。

从信息论的角度:设问了 \(k\) 次能够确定出答案,那么最初的答案候选集合一定满足 \(u(k+1)+v\le 2^k\)。(必要条件)

理由是:\(v\) 中的每一个只能对应唯一的回答方案,而 \(u\) 中的每一个可以对应 \(k+1\) 个回答方案,需要将它们全部辨认这样多的方案。

这里的方案是指判断一个点是答案所对应的回答方案,显然能够作出判断需要让每个答案所对应回答方案完全不同。

根据打表/分析的结论,只需要求出每个 \(k\) 对应的最大 \(U_k\),那么 \(v\) 一定是取 \(2^k-u(k+1)\) 的所有值。

\(U_k\)?也就是存在一个 \(x,y\) 的取法,使得转移到的两个状态 \((x,u-x+y),(u-x,v-y+x)\) 都满足 \(U_{k-1}\) 的限制。

可以得到:

  • \(u-x\le U_{k-1}\)
  • \(xk+u-x+y\le 2^{k-1}\),又因为求最大的 \(u\),因此可以令 \(y=0\),得到 \(u\le 2^{k-1}-x(k-1)\)。(注意这里的含义是能否存在一个合法的 \(y\) 取值即可)
  • \((u-x)k+v-y+x\le 2^{k-1}\),由于是存在,那么可以取 \(v-y\) 的最小,也就是 \(v=y=0\),得到 \(uk\le 2^{k-1}+x(k-1)\)

问题就变成求这个函数的最大值了。

一方面可以分讨分段函数,一方面也可以注意到该函数具备凸性可以三分。

至于后面的,就相当于计算直线下方与矩形的交,分讨一下就行。

T3 是较为困难的题目。

其核心思想是 找到比较的关键原则:K=0 时,比较非严格后缀最大值序列的字典序大小

加入 \(K\neq 0\),相当于用炸弹将问题强行分段,考虑从大到小填数,维护平局和胜局的情况。

假装我们已经知道了每个炸弹的分段位置,又因为要维持平局局面,所以实质上是处理 \((bomb,?),(>v,>v),(bmob,>v)\) 这几个情况中间插入的问题。

  • \((bmob,?)\) 由于需要保持平局,前面只能填 \((v,v)\),以防被提前引爆或者提前干掉 \(?\)。或者将其变成 \((bomb,v)\)
  • \((>v,>v)\) 前面是随便填的,因为怎么填都会被干掉。
  • \((bomb,>v)\) 需要讨论,如果这一段前面还啥都没放,则只能第一维放 \(v\)。只要放过东西了(也就是放过 \(>v\)) 了,上下就随便填了。

因此设 \(f_{v,i,j,0/1}\) 表示有 \(i\)\((bmob,?),j\) 个前面为空的 \((bomb,>v)\),最后一段的胜平情况。

转移枚举 \(a\)\((bmob,?)\) 变成 \((bmob,v)\)\(b\) 个空的 \((bomb,>v)\) 变得不空。胜局事实上相当于最后一段是不空的 \(bomb,>v\),平局相当于不空(也就是虚拟化一个炸弹在这里表示,如果是空的,那么说明是平局,如果不是空的,移除这个虚拟炸弹和虚拟的 \(>v\) 后会赢。)

枚举 \(c\)\((v,v)\) 插入,然后算出两个人分别剩下的 \(v\) 的个数插入到可以任意放的段中。

其核心要义是分讨清楚所有情况,从大到小填,划段的思想,以及给炸弹寻找匹配点的想法。、

初值赋法参考若用完了 \(K\) 个炸弹(初始标记 \((bomb,\infty)\)),就需要在末尾虚拟一个,否则炸弹在末尾没用,\(A\) 是必胜的。

day 3

T1 很简单,发现必须从 \(1,n\) 开始双头染色即可,每个独立部分相当于拓扑序计数。

最后容斥一下 \(deg=2\) 的点产生的重复贡献即可。

T2 很厉害,事实上是数据结构大集合,下面列出一些 Trick:

  • set 查找连续 \(k\) 个元素是均摊 \(k+\log n\) 的。

  • 查询路径上所有点,删掉路径后子树里最接近的黑点,支持黑点增删(不存在则不统计)。

    考察路径 \((u,v),lca=t,u\to t,v\to t\) 不考虑 \(t\) 单点贡献时比较容易,因为只需要考虑子树内。

    树链剖分,将每个黑点挂靠在树剖往上跳的到的所有点上,并用一个左偏树进行维护黑点存在性——延迟删除法可以提取出每个点轻子树内(包括自己)最严格的限制。

    对于重链,维护一个 set 表示重链上所有点的限制,以 dep 为关键字可以很容易提取出一条链的信息。

    对于跳上重链的底部点的贡献,相当于子树内扣掉一个儿子的方向,用 dfn 和 线段树维护区间最小值及其 id 即可。

    对于 lca,子树内扣掉两侧的子树,子树外还是可以考虑树链剖分,往上跳链,点权存成 \(dep_{dark}-2dep\),就变成了查重链上一区间的最小值。

    显然,跳到重链上的那个点,也相当于是子树内扣掉一个方向,同上维护即可。

  • 在游走问题:

    两个人分属路径两端,每个时刻可以选择一个人前进一步,有要求:位置 \(i\) 必须在时刻 \(a_i\) 被覆盖。

    必要条件:\(a_i\ge \min(i,len-i)\)。若 \(a_i\) 与子树大小一个量级,则 \(len\) 是根号量级的,否则一定无解

    如何 \(O(n)\) check?

    对于 \(i\),维护两人能否在 \((i,i+1)\) 相遇。

    其充要条件是:不存在 \(x\le i<y\),满足 \(\max(a_x,a_y)<x+len-y\)

    证明:选定 \(i\),每个位置就变成了“有多少步另一个方向走的空闲”

    贪心策略:每次走限制最严格的那个方向即可。(\([l,i],[i+1,r]\) 哪一边限制最严就去那边(相当于不断跳 \(a_j-j(j\le i),a_j-(len-j)(j>i)\) 的最小值))。

    那么这个问题对偶一下,就变成了只要任意点对合法,则全局合法(因为可以逐步往内缩小)。

    方案1:按 \(a\) 从大到小删点,用链表维护,每次只需要判断相邻两个是否有限制,如果有则禁止掉这一段区间。显然操作是线性的。

    方案2:(更进一步)

    考虑一对 \((x,y)\) 的限制:

    • 若有 \(a_x\ge a_y,x<j<y,a_x\ge a_j\),则替换为 \((x,j),(j,y)\) 不劣。
    • 若有 \(a_x\le a_y,x<j<y,a_y\ge a_j\),则替换为 \((x,j),(j,y)\) 不劣。

    综上,我们只需要保留 \(\forall j \in (x,y),a_j>a_x,a_j>a_y\)\((x,y)\) 即可。

    这样的 \((x,y)\) 只需要用单调栈一次求出即可。

T3 太巨了,无能为力。

day 4

是广东副队长yjl的交互构造选讲。

  • 对于构造类问题,我们第一步的思路必然是去尝试判断解是否存在。

    一般而言,我们会寻找构造中的一些不变量,或者去分析某个变量的具体性质,如上下界,奇偶性等。

  • 构造常用方法:

    • 递归法(数学归纳法):要求递归后解的存在性不变。

    递归法的底层可以是无限简化的情况,往往可以直接拿出解。

    更广泛的思想应该是剥离元素,简化局面。

    • 增量法:往往需要找到增量中的不变量。

    • 转化主体法(事实上是对问题作变形,改为更加用人话描述的结构)

    • 调整法

    • 做法拼合

    • 逆操作和复合操作

  • 基于局面特性给出的一些构造方向:

    (以下基于 YeahPotato 巨佬博客的梳理)

    括号序列相关

    • 前缀和化。将左右括号分别视作 \(\pm 1\) 并作前缀和,画出折线图。

    能给 flip 和 reverse 提供一个直观的几何解释,还能处理 \(\min/\max\) 相关,以及利用类介值定理证明存在性。
    事实上,这个技巧可以用在类似限制中,如QOJ9489,判断0100的插入复合串,可以赋值0:1,1:-3来研究折线图。

    • 路径化。看作网格图,将左右括号分别视作向右和向下。

    • 匹配括号连线。如 CF1503F。

    • 括号树(本质上是剥离括号的递归结构)

    根据定义,合法括号序列一般有两种观察方式:多个括号序列拼接并在外面套一对括号:(ABC...),以及找到开头括号匹配的右括号将序列分成两块:(A)B。这两种分别对应着正常括号树与三度化后的括号树。例: [WC2022] 序列变换

    • 折线图的下凸包与特殊点。在处理“最少操作次数使得括号序列合法”时,折线图的最小前缀和(最低点)往往直接对应所需的最少 flip 或左移操作数。

    • 栈的模拟性质。合法括号序列可以通过一个栈在 \(O(N)\) 内完全消除。在构造时,可以逆向利用栈的 push/pop 行为,把括号匹配转化为元素入栈和出栈的依赖关系。

    排列相关

    • 画点。在平面直角坐标系中画出 \((i,p_i)\) 是一种直观反映偏序关系的方法。例:[APIO2022] 排列。

    • 按值域构造。一种是以某种顺序扫描值域,另一种是只维护相对大小关系,每次插入再在值域中空出一个位置给新元素。

    这样可以减少构造受限性,可以用增量思想构造。

    • 置换环。涉及置换、交换使排序这类的题都可以把 \(i\rightarrow p_i\) 画出来。

    还有类似的排列转有向图的处理方法。例:CF1491G、CF1656G、CF1787F。

    更一般地应当观察题目结构给出具体转化方向,如[THUPC2024 初赛] 排序大师:交换两段区间,若构造一种基于 \((i,i+1)\) 上的值的连边,则只需要改动四条边。比如给出构造 \(a_i+1\to a_{i+1}\),终态要求全为自环。

    • 考虑逆置换。例:gym102154C。

    • 拓扑序。用 DAG 的拓扑序来理解所求的排列。例:CF1477D、CF798E。

    • 逆序对数。常用于分析无解。例:CF804E、(樱花抄)、[互测 2022] 魔术师。

    • 贪心。要求排列字典序最小时,逐位贪心判断可行性即可。例:CF1530E、CF1844F1、(roast)。

    • 通过操作排序排列/还原排列:对操作进行复合,拿出可以判断大小或者确定值的操作。

    可以从快速排序(往往设计最轻松,但很难面对卡得很严格的 \(n\log n\)),归并排序(次数严格,但往往适合自底向上),插入排序(使用二分法,次数严格),堆排序(场景严苛,次数严格)。

    例:排序大师

    • 极值规约构造,增量构造。

    • 奇偶性不变量(Parity Invariant)。排列的逆序对奇偶性,在任何仅交换相邻元素的图中是不变量;在所有形如“交换距离为 \(k\) 的元素”的操作中,可以将排列拆分为 \(k\) 个独立的剩余系,分别讨论奇偶性。这是用来进行严谨无解证明的最常用工具。

    • 群论与生成元。给定几种置换操作,要求构造目标排列。本质是求群的生成元。若操作包含一个长循环 \((1,2,\dots,n)\) 和一个对换 \((1,2)\),则可以严格证明能够生成整个对称群 \(S_n\)

    二维相关

    • 拆成一维。例:CF417E。

    • 补充:曼哈顿距离与切比雪夫距离转换的边界提取

    \(45^\circ\) 后,\(x\)\(y\) 坐标变得完全独立。构造时可以对 \(x\)\(y\) 分别采用一维上的贪心或双指针。

    • 拼图法。找到构造中的小单元去试探。例:CF1628C、CF1034B。

    • 棋盘染色。即按 \((x+y)\bmod k\) 将格子分类,保证长为 \(k\) 的段必然包含每类各一个,用于加强命题方便构造,或判断无解。例:CF1450C2、CF763B、CF1268B、CF1485D。

    • 拓扑学方法。主要包括转向度数和、穿过次数奇偶性、欧拉定理、皮克定理。

    • 行列和。作为守恒量用于判断无解。例:CF1672G。

    • 网络流二分图建模。将二维网格的行视作左部点,列视作右部点。格子 \((x,y)\) 填入的值视作边权或流量。当题目给出“每行和、每列和的限制”时,可以直接利用最大流/可行流的满流定理来证明解的存在性并给出构造。

    数论相关

    • 互质对构造\((n,n+1)\)\((n,2^k-1)\)(n 奇)、\((p,n)\)(p 质)。例:CFgym102055C、LOJ3392、CF922F、[互测 2022] 大冬天题。
    • 拆二进制以及辗转相除法。例:CF341E。
    • 原根。乘转加。
    • 互质/整除图。可以更加直观。例:CF1148G。
    • 预处理常数。如果只允许使用特定材料构造出某个数,那么可以考虑先用方程把相关要用的常数解出来,然后用二进制拆分等构造。例:CF1060H、CF1427E。
    • 模意义下考虑。如果条件是不等式,那么模意义就是加强条件;如果是等式,那就需要倍增。例:CF1218G、CF1844G。
    • 裴蜀定理(Bézout's Identity)与线性组合。当且仅当 \(\gcd(a,b) \mid c\) 时,\(ax+by=c\) 有解。在构造加减法操作时,经常用于证明某个极小正整数是可达的。
    • 中国剩余定理(CRT)的构造性。不仅用于求值,在构造要求“模不同素数具有不同性质”的序列时,CRT 提供了严格的同构映射。

    树相关

    • 归约最小/大生成树。例:CF1054G。

    • 叶子调整/规约/增量法

    • 边权为标号差绝对值的最大生成树。前一半连 \(n\),后一半连 \(1\)。例:CF1474E、CF1656F。

    • 缩点转化为树。仙人掌,边双点双等

    • DFS 树自底向上构造。

    • 菊花,链的极端情况打开思路。

    CF1474E

    • 三度化构造

    • 点,边分治算法递归构造

    • 考察中心,重心,路径,直径等具备的特殊性质。

    • 考察欧拉序,dfn,树的括号序列等表达方式

    • Prufer 序列。当题目对构造树的度数有严格要求时(例如给定每个点的度数 \(d_i\) 构造树),Prufer 序列给出了充要条件:\(\sum (d_i - 1) = n - 2\),且可以直接根据序列贪心构造。

    • 严格 \(O(N \log N)\) 数据结构的介入。在增量构造或树上调整时,为了避免启发式算法(假算)或均摊退化,常利用线段树合并(替代暴力合并或部分 ST 表)来实时维护连边集合或极值,从而在图论或树上构造中“卡死”复杂度,确保严谨的 \(O(N \log N)\)

    图论相关

    • 考虑反图

    • 利用 \(\sum deg=2m\) 来均摊。在处理实现≤ 显然,≥ 每次剥掉一层入/出度为 0 的点。细节,确定枚举方式时可以提供依据。例:CF1444C。

    • 找 dfs 树。往往可以简化构造。例:CF1680F、[IOI2019] 景点划分、CF1515F。

    • 缩点,染色构造

    CF1368E

    • 考虑二分图。Hall 定理等。

    • 进行 bfs。主要是从邻边和距离视角观察。例:CF1470D、CF1368E、CF1019C、CF794D。

    • 竞赛图性质。存在哈密顿路、可分层、度数最小的点到其他点距离均 \(\le 2\)。例:CF1779E。

    • 图相关序列判定定理。包括 Erdős–Gallai 定理、Landau 定理等。例:USACO14MARGoldT3。

    • 邻接矩阵。例:AGC061B。

    • 赋点权来决定边权。例:CF42D。

    • 互斥条件。有一类题目是要求在图中找两种结构之一。先尝试找一种,假设找不到再试另一种。例:CF1364D、CF1148G、CF1439B、(schrodingersjerry 和图染色)。

    • 2-SAT问题建模

    • 找路经:规约/增量,如找 \(deg\) 的极值,或者特殊图的子结构。

    • 找符合条件的子图

    1. 信号连接欧拉路,常用于边不相交的构造。
    2. 链覆盖,点覆盖,独立集等角度。
    • K染色,Vizing 定理与 \(D(G)\) 的结论。

    • 弦图(Chordal Graph)与完美消除序列。在区间相交图、树上连通块相交等模型中,可以利用完美消除序列从后往前贪心染色或构造最大独立集,能避开 NP 难的陷阱。

    格雷码

    • 格雷码:适合构造方案相差不超过 \(1\)

    构造:对于二进制数 \(t_1t_2t_3\dots t_m\),其格雷码对应 \(t_1(t_1\oplus t_2)(t_2\oplus t_3)\dots (t_{m-1}\oplus t_m)\)

    欧拉回路/路径

    遇到类似与"相关和为 \(0\)",”极差不超过 \(1\) “的守恒条件,以及“度数奇偶性”时可以考虑用欧拉回路/路径构造。

    鸽巢原理

    1. 满足 \(\frac{a}{b}S\) 的选点构造,如CF2207G,选出 \(b\) 个方案总和至少为 \(aS\) 就可以了。

    2. 借助的一些证明,如生日悖论,\(n+1\) 个数必有 \(\bmod n\) 同余的数等。

    • 给定一个长为 \(n\) 的序列,必然存在一个子区间其和为 \(n\) 的倍数。

    • 在确定的大小为 \(n\) 的空间中走 \(n\) 步必然进入环。

    CF618F,CF1450C2

    绝对众数

    • 排列数字,使得相邻数字不相同。
    • 摩尔投票(Boyer-Moore)的区间拓展。不仅是全局找众数,在需要保证“某个元素出现次数超过一半”的构造中,可以用摩尔投票的思想抵消不同元素。若拓展到条件“出现次数超过 \(\frac{1}{k}\)”,则同时维护 \(k-1\) 个候选人和计数器即可。

    Dilworth 定理

    往往给人一种"双向限制"的感觉。

    • 最长链 = 最小反链覆盖

    • 最长反链 = 最小链覆盖

    求最长反链:

    • 法 1:取二分图最大独立集中两部均在内的点。记最小链覆盖为 \(s\),则最大匹配为 \(n-s\),最大独立集为 \(n+s\),两部均在内的点至少 \(s\) 个。
    • 法 2:求出所有可能在最长反链中的点,每次任选一个,删除与它有偏序关系的点,归纳。

    信息论与交互式构造

    交互题本质上是在隐藏状态空间中构造一条确定的搜索路径。

    • 信息熵与理论下界。如果要从 \(N\) 种等概率可能中找出一个状态,每次返回 0/1 的询问至少需要 \(\lceil \log_2 N \rceil\) 次。这是用来排除“不可能的构造方案”的绝对准绳。
    • 带谎言的交互(Ulam's Game)。如果在询问中允许返回错误信息(例如出题人最多撒谎 \(k\) 次),不仅需要考虑当前剩余的可能集合,还要引入类似汉明码(Hamming Code)的冗余信息或状态权重分配,通过多次加权二分来严格缩小候选域。
    • 整体二分与并行构造。当需要同时为多个元素寻找插入位置或满足条件的边界时,将所有元素放在一起利用分治在值域或操作序列上进行并行二分(Parallel Binary Search),可以保证总体判断的单调性,并将总复杂度严格控制在 \(O(N \log N)\) 级别。

    线性代数与异或空间

    涉及按位异或、子集异或和等问题,本质是 \(\mathbb{F}_2\) 域上的线性代数。

    • 线性基(Linear Basis)。如果题目要求构造一个集合,使其异或和能够表示某些特定的数,直接提取给定数集的线性基。基底的大小决定了生成空间的维度,且基底中的元素可以互相异或以构造特殊性质(如主元唯一性)。

      CF1101G

    • 矩阵的秩与解空间。对于翻转游戏 (如点亮周围的灯)、图上的异或路径等,可以列出异或方程组,利用高斯消元求出自由元的个数 \(k\),从而得知共有 \(2^k\) 种合法构造方案。

      P2692

    极值与不变量法

    在看似毫无规律的复杂操作体系中寻找不变的性质,从而直接推导出目标状态。

    • 势能函数法。定义一种状态的“势能”(如所有元素的绝对值之和、图中的逆序对数、特定的二次型)。证明每次题目允许的操作都必定使势能严格单调下降(或上升)。由于势能有下界(或上界),证明了操作序列必定在有限步内终止,终态即为所求。

    • 守恒量(Conservation Laws)。寻找在所有操作下均保持不变的量。例如:每次操作使两个数 \(+1\),另一个数 \(-2\),则所有数模 \(3\) 的和是不变量。如果不变量的初态与终态不符,则可严格证明无解。

      CF1110E.CF1383B

    随机化与概率性证明 (Probabilistic Method)

    很多时候我们不使用随机化来写“假算”,而是用概率方法证明某种构造必定存在,再通过去随机化转为确定性算法。

    • Erdős 概率法。如果要证明一种满足多个约束的染色方案存在,可以计算随机染色的方案破坏任一约束的概率总和 \(P\)。只要证明 \(P < 1\),就严格证明了至少存在一种合法构造。
    • Karp 随机取样方法。

    CF1114E CF843B

题目中的构造技巧:

  • XXII Open Cup, Grand Prix of Gomel K. Kilk Not

    答案可二分,判断可行性时,dp 上界再 dp下界,若消耗量在这个上下界内部则有解。

    方案通过 DP 进行还原即可。

  • THUPC2024排序大师,区间交换,构造连边方法 \(a_i+1\to a_{i+1}\)

  • 木林森:删掉局部影响最小的结构,如叶子。

  • The 3nd Ucup Stage 40: Potyczki A. AGI

    注意特殊结构,包含区间和相离区间。全删去规约后变成特殊子结构,手算方案。

  • GDCPC2024 F. 图 规约法,找 \(deg\) 最小的点,将其出边进行路径匹配缩合,使得删掉这个点,问题可规约。

  • 星图:考察可删子结构欧拉回路。找到最小变化代价变为可删子结构。接着用规约法规约到 \(n=k+2\) 再利用欧拉回路的构造这样不会爆上界限制。

  • Yokohama Regional 2022 F. Make a loop

    划分出四个非空不交集合 \(A,B,C,D\),满足其大小奇偶性相同,且 \(SA=SB,SC=SD\)

    构造 \(X=A\cup D,Y=A\cup C\),满足 \(SX=SY=\frac{sum}{2}\),且 \(|X|,|Y|\) 不同且偶数大小。

    \(A=X\oplus Y,B=U/{(X\cup Y)},C=Y/A,D=X/A\)

  • EUC 2026 F. Fix the Coloring

    3-sat 问题作局部枚举后转化为2-sat问题。

  • The 2nd Ucup Stage 16: Run Twice I. Telepathy

    找到 \(n=3,k=1\) 的特殊解,将一般情况的 \(n\) 三个三个分组施加 \(n=3,k=1\) 的构造,合并可以得出解。

  • 琪露诺的符卡交换:让每行每个数字恰出现一次,等价于让每列每个数字恰出现一次后转置。

  • JOISC 2016 Day4 B. City

    标号 \(dfn,siz\) 判断子树关系,尽可能压缩 \(|\log \max dfn|+|\log \max siz|\) 这种东西。

    考虑适当扩大 \(siz\),使其落在某一固定序列上(比如选出公比为 \(1.05\) 的等比数列),这样只需要将 \(dfn\) 扩大若干倍数,却远远缩小了 \(siz\) 的可选集合。

day5

  • T1 快慢指针判环法

  • T2 要看出来考察全局可能达到的最小的最大值 \(val\),那么每个数能达到的最大值 \(>val,<val\) 的话答案立判,否则 \(=val\) 如何查看有无解?让容量全部变成 \(val-1\),一方面需要最大流为 \(m-1\) 保证存在唯一 \(val\),其次将容量变成 \(val\) 后点 \(i\) 可以继续增广,即 \(i\to t\) 是连通的。

  • T3 最核心的是看出来如何计算 \(f\)

    \(f[l,r]\):不能出现在答案中的,当且仅当:将所有问号看作左括号时仍然不能匹配的右括号数,加上将问号看作右括号的仍然不能匹配的左括号数。

    也就是:设 \(a_i\) 为将所有问号看作左括号的前缀和,以及 \(b_i\) 为将所有问号看作右括号的前缀和,有:

    \(f_{l,r}=r-l+1-[a_{l-1}-\min_{i\in [l-1,r]}a_i]-[b_r-\min_{i\in [l-1,r]}b_i]\)

    证明:

    显然,存在最优策略,使得一个前缀用左括号,一个后缀用右括号。

    可以发现 \(a\) 的极低点一定在 \(b\) 的极低点之前。理由是 \(a_i-b_i=2\times cnt_{i,?}\) 不降,因此 \(a\) 的区间最小值出现位置一定不早于 \(b\) 的区间最小值位置。

    因此两边互不影响,取 \(a\) 的区间最小值位置,在其前面全变成左括号,后面全变成右括号即可。

    后续扫描线较为平凡。

day6

  • T1 以为是个打表题,结果是个bitset题。

    注意到两个点曼哈顿距离为 \(1\) 一定必败即可。

  • T2 是神秘题目。

    构造一个 DAG,使得从 1 号点到 n 号点的所有路径长度组成的集合,恰好等于输入集合 S。

    最基础的构造可以用 \(2\sqrt n\) 个点,两两连边,边权为路径长度。

    合理的想法是将 \(2000\) 个点进行分段,设 \(B\) 个一段(段首必须有值),建立 \(2^{B-1}\) 个虚点,满足 \(1\) 到这些点的路径集合是 \(1\sim B-1\) 的集合,加上 \(0\)

    接着将每一类型的段进行归类,套用上一个根号做法。

    进行适当分析和卡常可以做到 \(53\) 个点。

  • T3 是色多项式的应用。

    • 无向图的色多项式:染色后使得所有有边的点的颜色不同的方案数

    二分图的色多项式:

    \[\chi_G(\lambda) = \sum_{\Pi \in \mathcal{P}(A)} \lambda^{\underline{|\Pi|}} \prod_{v \in B} (\lambda - d_\Pi(v)) \]

    其中:

    • \(\mathcal{P}(A)\) 是集合 \(A\) 的所有划分方案。
    • \(\lambda^{\underline{k}} = \lambda(\lambda-1)\dots(\lambda-k+1)\) 是下降阶乘。
    • \(d_\Pi(v)\) 表示在划分 \(\Pi\) 中,有多少个块(Block)与 \(B\) 中的顶点 \(v\) 有边相连。
    • 根据 Stanley 的定理,无向图 \(G\) 的无环定向方案数等于其色多项式在 \(-1\) 处取值的绝对值,即 \(D = |\chi_G(-1)|\)

day7

吃了一下广东的特色潮汕牛肉火锅,味道很不错。

然后去找了个公园,生态实在是太好了,扶手上全是虫子。

晚上打了一晚上游戏。

day8

  • T1 是平凡的点分治问题,从分治中心往下dfs的时候,贪心地让反转的标记尽可能往上。

    问题就变成了给定 \((v_i,c_i,l_i,b_i,col_i)\),求 \(b_i\neq b_j,c_i+c_j+[col_i=col_j\&l_i+l_j>k]\le m,\max v_i+v_j\)

    按照 \(c\) 桶排并维护代价前缀各个颜色的最优 \(v\),异色处理是平凡的。同色可以先假装后面那个限制成立,求 \(c_i+c_j\le m-1\) 的答案,这样就只会剩下 \(l_i+l_j\le k,col_i=col_j,c_i+c_j=m\) 的了。

    对于每个桶双指针一下就行,复杂度 \(O(n\log n)\)

  • T2 是很牛的交互题。

    考虑一次询问是一个独立集,问题可以变成:

    1. 找到一个极大独立集 \(A\),借此划分出剩下两个独立集 \(B,C\)
    2. \(A \to B\cup C\) 有两条边,\(B\to C\) 可能存在边,找到这些边。

    所以问题可以简化为:

    1. 找到极大独立集 \(A\)
    2. 找到集合 \(X\) 到集合 $Y $ 的所有边。

    找到 \(A\):先随机排列,考察返回结果,实际上是返回所有的谷底,这些在 \(A\) 中。

    若将谷底们全部放到最后,则会询问得到谷底的相邻集合,这些一定不在 \(A\) 中。

    循环这个操作,每次将 \(A\) 中的放最前面,确定不在 \(A\) 中的放最后面,得到 \(A\) 新的增量以及新确定的不在 \(A\) 中的元素。

    考察每次询问,会使得原随机排列的一段谷长度减小 \(2\),又因为 \(n\le 10^5\),所以这里大约只需要 \(\frac{\log n}{2}\) 次操作(因为期望最长谷底长度也就是 \(\log n\) 左右)

    极大概率可以在 \(9\) 次以内得到解。

    找到集合 \(X\) 到集合 \(Y\) 的所有边。

    弱化为找集合 \(X\) 每个元素到集合 \(Y\) 中首个相邻的点。

    考虑整体二分,对于一个元素 \(X_i\),二分的值为 \(mid\),则只需要保证 \(X_i\) 放到 \(Y_{mid}\) 的前面,若返回了 \(X_i\) 就说明它的首个相邻点在 \(Y[mid,r]\),否则在 \([l,mid-1]\)

    因此只需要将 \(X_i\) 挂在 \(Y_{mid}\) 前面即可,每次可以整体询问并行计算

    至于找所有边,可以将 \(Y\) 倒过来再问一次。

    核心思想:

    1. 整体二分,并行计算
    2. 弱化条件,只求靠前的一个
  • 图计数基本功大赏。

    • \(C_{k,e}\)\(k\) 个点 \(e\) 条边的无向连通图(允许重边)个数:

      \(C_{k,e}=M(k)^e-\sum {k-1 \choose i-1}C_{i,e_1}{e\choose e_1}M(k-i)^{e-e_1}\)

    • \(F_{k,e}\):恰好在加入第 \(e\) 条边连通的方案数:

      \(F_{k,e}=C_{k,e}-C_{k,e-1}M(k)\)

    • \(E2_{k,e}\)\(k\) 个点 \(e\) 条边的边双连通图个数:

      \(E2_{k,e}=C_{k,e}-\sum{k-1\choose c-1}{e\choose i}E2_{c,i}B_{c,k-c,e-i}\)

    • \(B_{c,k,e}\):缩点后的, \(c\) 个点大小的EDCC作为树根,外挂 \(k\) 个点和 \(e\) 条边的方案数。

      \(T_{s,e}=C_{s,e-1}·s·e,B_{1,k,e}=\sum {k-1\choose s-1}{e\choose j}T_{s,j}B_{1,k-s,e-j}\)

      \(B_{c,k,e}=\sum B_{c-1,s,i}B_{1,k-s,e-i}{e\choose i}{k\choose s}\)

    • \(Sum_{k,e}\):所有 \(C_{k,e}\) 中,每个边双大小 \(c_i\)\(M(c_i)\) 之和。

      \(Sum_{k,e}=\sum (\sum {e\choose i} E2_{c,i}B_{c,k-c,e-i}){k-1\choose c-1}M(c)\frac{k}{c}\),除以 \(c\) 的原因是每个点都会被计算一次。

day 9

  • T1:显然可以拆到每个点上,考虑算每个点没有每种颜色的方案数,最后算答案。这个过程绕基环树的环暴力是 $O(nm) $ 的,稍加优化就可以做到 \(O(n^2+m\sqrt n)\)

  • T2:其实这个题很牛,但数据太水了怎么都能过。

    一个点被到达的点的集合,是存在其两个祖先 \(y,z\),满足 \(y\) 子树内的点以及 \(y-z\) 这条链上的点可到达,一或者没有 \(y\),只有 \(x-z\) 这条链上的点可到达。

    DAG上拓扑求这对东西。

  • T3:这个题不牛,但它放在T3。其实用点分治随便扫扫容斥一下就过了。

day 10

是图论专题。

  • CF1458D

    比较神秘的转化,01个数相同的区间,01反转加上前后翻转,相当于将 \((1,-1)\) 的前缀和序列这段区间进行翻转。

    接着问题就可以变成区间端点颜色相同就能翻转,最小化字典序。

    所以建立图 \((s_i,s_{i+1})\),一次翻转相当于翻转一个环的边的指向。

    又因为存在经过所有边的路径,相当于找字典序最小的欧拉回路。可以暴力走尽量小的点,如果有返程的边的话。

  • AGC018F

    主要是看出来奇偶性相同,取值一定是 \({0,1,-1}\) 之间,偶数度数的点必然取 \(0\)

    那么两颗树对应点,若度数为奇则连边,变为欧拉图,跑欧拉回路,根据横叉边方向指定 \(1,-1\)

  • CF1672G

    操作可逆。

    可以从每个位置的操作次数角度说明,设 \(C_{i,j}\) 表示位置操没操作,设 \(C\) 的行和列和。

    设初始颜色,那么考察最终状态和行和列和都需要为 \(0\)。可以得到关于 \(n,m\) 的奇偶性与是否初始局面的行和/列和需要全部相同。

    另外,再复合一下操作可以得到一次可以更改矩形的四个角,则若终末行和列和全为0,则一定可以改为全0。

    最后可以转化为求异或方程组自由元个数。

  • P7214

    放在平面上考虑,将每个治疗方案得到的安全位置这个等要三角形画出来,相当于找一条从左边界到右边界的最小代价路径。建图列一下不等式就能容易优化建图了。

  • CF1889E

    考虑建图,在 \(T_1\) 中的一条边 \((u,v)\) 被选择,则 \(T_2\) 中路径 \((u,v)\) 也必须被选择。反之类似。

    用各类优化建图手段建出图,得到一个类似2sat的东西。

    缩点,考虑一个方案是怎么得到的。

    首先在DAG上选出一个点进行交换,此刻它所达的点都要参与交换。

    同时,我们可以通过多次交换(可以在DAG上选之前选的点的后继点,交换回去,也就是撤销掉这一堆贡献)说明,对于任意的DAG上每个点可以独立选择,方案构造可以考虑按拓扑序依次构造。

    那么答案就是 \(2^{cnt}\),即缩点后图点数。

  • CF1019C

    先忽略掉第一个限制,考虑如何让任意没选出的点都可以被选出的点一步到达。

    这很容易,我们可以按 \(1\sim n\) 的顺序扫描所有点,如果一个点,可以到达它的点都没被选择,则选择它即可。

    考虑扩展。观察这样的贪心选出来的点集满足什么条件?

    1. 这个点集的导出子图是DAG——保留的边,只能按扫描时间从晚指到早。
    2. 对于一个DAG,按拓扑序执行如上贪心策略,选出的点集一定是独立集。

    由于原问题是两步内到达,这启发我们再对这个DAG做一次选点即可。

    这样选出的答案可以在一次操作内得到整个DAG,再走一步得到解

  • CF1942H

    将加减视作分配,即匹配。

    \(b\) 为初始的需求值。

    考察Hall定理,将 \(a\) 当作左部点,\(b,c\) 当作右部点,那么就可以形式化“抵消”操作了,转而要求左边存在完美匹配。

    定义 \(a_x\)\(b_y\) 有边,当且仅当 \(a\)\(b\) 的祖先或者儿子。

    定义 \(a_x\)\(c_y\) 有边,当且仅当 \(a\)\(c\) 的祖先或者后代。

    所以可以考虑选一个 \(b\) 的点集合 \(S_1\)\(c\) 的点集合 \(S_2\),拿出 \(W(N(S_1)\cup N(S_2))-W(S_1)-W(S_2)\) 的最小值。

    考虑 dp,显然,我们只关心点 \(u\) 是否被计算,以及子树 \(u\) 是否都被计算(这决定着能否选 \(b,c\)

    \(f_{u,0/1}\) 表示选了 \(u\),选了整个子树 \(u\) 的最小值,没选 \(u\) 的最小值显然是 \(0\),即全不选(因为子树内无法选择任何的 \(b,c\)

    根据不选 \(b,c\)(子树可以不选儿子 \(v\)),选 \(b\) 不选 \(c\)(子树必选儿子 \(v\)),以及 \(b,c\) 都选(子树必选全选儿子 \(v\) 的子树)分三类转移,可以DDP维护。

  • CF1519F

    似乎是纯暴力题目,爆搜压一下匹配状态。

  • AGC029F

    考察树只有 \(n-1\)​ 条边,那么也就是每个集合贡献一条树边。

    找一个必要条件:选出一个集合的子集 \(S\),满足 \(S\) 中的所有边事实上提供了多少个连通关系(即添加所有边后 \(n-\) 连通块数),对于每个 \(S\) 都必须满足这个不少于 \(|S|\)

    考虑如何确定一棵树,其本质是子节点单向匹配父节点,一个集合就是一条边。

    不妨定 \(1\) 为根,我们考察这个构造:

    • 加入点 \(1\) 的所有边,提取出其所有的未被提取的儿子
    • 按顺序遍历每个儿子,重复上面的操作。

    这样做肯定没问题,只是不满足每个集合恰提供一条边的性质。可以考虑修改一下,用点 \(2\sim n\) 去匹配集合 \(1\sim n-1\),显然需要存在完美匹配,否则无解。

    考虑修改构造:做这样的操作:

    • 将点 \(1\) 所在所有集合的匹配点作为其儿子。
    • 遍历 \(1\) 的儿子,重复这个操作。

    BFS和DFS遍历都可以。

    容易证明如果存在完美匹配且加入所有边后图连通则这个构造一定有效。

day11

  • T1 绷不住了,又是大计数。

    先考虑一维的情况,显然是一个容斥。

    \[\sum {{i\choose 2}\choose n}\sum_{j\ge i}{j\choose i}(-1)^{j-i} \]

    考察 \(S_i=\sum {j\choose i}(-1)^{j-i}\) 是什么东西。

    \[S_i=\sum({j-1\choose i-1}+{j-1\choose i})(-1)^{j-i}=S_{i-1}-S_i \]

    得到 \(2S_i=S_{i-1}\)。显然 \(S_0=\sum (-1)^i=\frac{1}{2}\),所以 \(S_i=2^{-i-1}\)

    扩展到 \(k\) 维,相当于给每一维选指标 \(i_j\)

    \[\sum_{i_1\sim i_k} {\prod_{j=1}^k{{i_j\choose 2}}\choose n}\prod_{j=1}^k\frac{1}{2^{i_j+1}} \]

    提取出 \(\frac{1}{n!},2^{-k}\),得到:

    \[\sum_{i_1\sim i_k}\left(\prod {i_j\choose 2}\right)^{\underline{n}}2^{-\sum i_j} \]

    考察拆下降幂为斯特林。

    \[\sum_{i_1\sim i_k}\sum_t{n\brace t}\prod {i_j\choose 2}^t2^{-i_j} \]

    注意到每个 \(i_j\) 变得独立,意味着只需要求:

    \[A_t=\sum 2^{-i}{i\choose 2}^t \]

    答案就是:

    \[\sum_{t } {n\brace t}A_t^k \]

    \(A_t\) 中这个 \({i\choose 2}\) 会比较麻烦,尝试拆掉它。

    \[A_t=\sum 2^{-i-t}(i^2-i)^t=2^{-t}\sum_{j}{t\choose j}\sum_{i}i^{t+j}(-1)^{t-j}2^{-i}=2^{-t}\sum_{j}{t\choose j}B_{t+j}(-1)^{t-j} \]

    得到要求 \(B_{t}=\sum i^t2^{-i}\)

    即:

    \[B_t(x)=\sum (i-1+1)^t2^{-i}=\frac{1}{2}\sum_j{t\choose j}\sum_i (i-1)^j2^{-(i-1)} \]

    也就是:

    \[B_t(x)=\frac{1}{2}\sum_j{t\choose j}B_{j} \]

    \(B_0=\sum 2^{-i}=2\)

  • T2 容易观察每次一定存在方案让最短路要么减少 2 要么不变,而最短路奇偶性始终不变。

    因此只需要简单的奇偶性和上下界判断就能得到 YES/NO。

    考察删除什么样的结构才可以做到最短路最多减少 \(2\)

    直观地,我们企图删除:

    1. 一个角
    2. 一个孤岛

    这类图形,可以稍加讨论找到具体情形。

    可以找到这些点的一个删除顺序,再二分这个删除序列,得到所求答案。

  • T3

    先考察特殊性质:每个点只有两个儿子。

    可以 \(n\) 次判断每个点是否是叶子:询问全局除掉这个点,观察答案是不是 \(n-2\)

    找到叶子后,考虑如何找到一个叶子 \(x\) 的父亲。

    注意到,若询问叶子集合除去 \(x\),我们会得到 \(n-2\),即叶子 \(x\)\(father_x\) 无法出现。

    则可以二分 \(father_x\) 在非叶子集合中的位置:将非叶子排成一行,二分 \(mid\),加入 \([1,mid]\),若结果是 \(n-2\) 则说明父亲在右侧否则在左侧。

    找到父亲后就可以删去这个叶子了。若这个父亲的两个儿子都被删了,则自己成为新的叶子。

    这样可以严格 \(n+n\log n\)

    再考察有一度点的情况。

    先判断无解:发现若两个一度点作为父子,则无法区分,即要求由一度点的导出子图全是单点。

    并且,在最初的 \(n\) 次询问中,若除去的是一度点,则答案是 \(n-1\),由此,我们可以判断出哪些点是一度点。

    可以考虑,先把度数为 \(2\) 的点和叶子所组成的虚树建立出来,然后考虑如何插入一度点。

    对树做重链剖分,类似全局平衡二叉树做带权二分即可。

day12

  • T1:打表题,何意味。

  • T2:

    可以看出来,传送门相当于是交换两条边的两个端点,即把 \(u-v,x-y\) 换成 \(u-y,v-x\)

    不妨将一条边看作两个半条边,可以给每个半条边做匹配,得到新的树。

    因此,相当于找到一颗树,使得:

    1. 每个点度数与原树一致。
    2. 特殊点的深度之和最小。

    如何找到这样一颗树呢?做一些分析:

    1. 当所有点都是特殊点时,显然按度数从大到小填。
    2. 一般情况:同类点,必然深度越浅度数越大。
    3. 对于一个深度更大度数更大的特殊点,一定可以替换掉一个更浅度数更小的非特殊点。

    因此,这告诉我们,将特殊点与非特殊点各自按度数从大到小排序,按 BFS 序拿出这个树,则一定存在一个分割点 \(p\),满足 \([1,p]\) 是按度数为第一关键字,是否特殊为第二关键字放的,\([p+1,n]\) 是按是否为特殊点为第一关键字,度数为第二关键字放的。

    如何对于每个 \(p\) 算出答案?\(O(n^2)\) 暴力呼之欲出。

    如何优化这个暴力?按层填。

    \(p\)\(1\to n\) 扫描,维护当前层的深度,这一层能够再放多少个点,下一层已经有了多少个空位能放点。

    将特殊点按照度数从大到小排序,从第一个还没放进树的特殊点开始一层一层往下填写。非特殊点不用考虑。

    但是这样还是会GG,为什么呢?会被链卡掉,如何优化?

    当剩下的所有未填写的特殊点所能提供的空位 \(\le 1\) 时,我们可以直接算出最终答案。

    则可以说明这个过程是 \(\log n\) 的,即每次,一层的大小至少会扩大两倍。

    事实上可以更加分析到线性:

    考虑最初一层再跳一层(把初始给到的贡献算上)的大小 \(x_0\),后续每一层大小至少扩大一倍,则至多 \(\log \frac{n}{x_0}\) 层,而按照最初的策略,\(x_0\) 是单调不降的,则至多是:

    \[\sum \log \frac{n}{i}=n\log n-\log n! \]

    根据斯特林公式:\(n!\) 约为 \(\sqrt{2\pi n}\frac{n^n}{e^n}\),即:$\log n! $ 约为 \(\log \sqrt{2\pi n}+n\log n-n\log e\),而 \(\log e\) 为常数,可以说明 \(\sum \log \frac{n}{i}\) 约为 \(Cn\),其中 \(C\) 为常数。

  • T3 太困难,跑路了。

posted @ 2026-05-08 20:42  spdarkle  阅读(6)  评论(0)    收藏  举报