🍕🏠🌋 当前时间是:

 

2025.11

P5292 [HNOI2019] 校园旅行

直接 \(O(m^2)\) 的暴力是,总共有 \(O(n^2)\) 的状态 \((x,y)\),从极小的合法状态开始扩展出所有合法状态。

回文路径这个条件看上去就很困难,考虑去优化暴力。

而暴力的过程也无法直接优化,考虑能不能保留较少的边。

边按端点颜色可以分类成 (0,0),(1,1),(0,1) 三种。

考虑保留所有 (0,0) 边,似乎每个连通块取一个生成树就能张成原图的所有回文路径的 (0,0) 片段了,但是注意到路径长度的奇偶性存在问题,需要检查一个连通块是不是二分图,如果是则要保留至少一个奇环。对于 (1,1)、(0,1) 边是同理的。

这样边数就能降到 \(O(n)\) 跑暴力了。

CF1893E Cacti Symphony

要做一个特别的染色操作,现在分析一些性质。

由于 \(1 \oplus 2\oplus 3=0\),所以如果一条边两端颜色为 \((x,y)\),那么这条边颜色一定取自 \(\{x,y\}\)

考虑满足点的限制的条件。

设该点的颜色为 \(x\),那么如果给这个点删掉一条颜色为 \(x\) 的边,其合法性不变。

而剩下的颜色异于 \(x\) 的边,首先同种颜色的边内部异或会抵消,而异种颜色的两条边异或起来恰好是 \(x\)

因此能推出该点的满足限制等价于有奇数条颜色异于 \(x\) 的邻边。

有了这个结论,对于一个确定的点的染色方案(邻点颜色不同),只需给边定向即可。所以好处是现在能把点边的方案分离开了。

首先解决仙人掌点染色,这部分有很多做法,比较简单的是按 dfs 的顺序加点加环。

接着考虑第二部分。先注意到有解的一个必要条件是 \(n\equiv m\pmod 2\),而这也是充分的,因为可以取一棵生成树自底向上构造边的方向。而这也顺带告诉我们非树边方向的方案对应一个原图的边定向方案。

把两部分答案相乘即可。

QOJ #5504. Flower Garden

区间 \([l,r],[a,b]\) 的限制即为 \(\forall i\in [l,r],j\in [a,b],x_i\leq x_j\)

建图缩点后相当于选出来一些闭合子图并起来权重和在 \([n,2n]\) 之间。

如果存在至少一个 scc 大小 \(\ge n\),那么 check 这个 scc 的闭合子图和反图上的闭合子图即可(因为选了这个 scc 就一定已经至少有 \(n\) 的大小了,所以希望选尽量少的其他点)。

否则可以一层一层选 0 入度 scc 直到总大小达到 \(n\),此时一定有解。

实现需要优化建图。

QOJ #8461. 绝目编诗

判定一个无向图是否存在长度相等的简单环。

考虑把所有简单环搜出来,根据鸽巢原理,只需要搜前 \(n\) 个环。

枚举环上的一个点,搜包含它的环,为了保证复杂度,希望只走可能在环上的,因此每次递归需要 \(O(n+m)\) 检查一下能不能不经过搜索树上的祖先走到起点。

一个优化是钦定枚举的起点是环上编号最小的起点。

由于每个点只会被搜到 \(O(n)\) 次,因此需要做 \(O(nm)\) 次 check,总复杂度就是 \(O(nm(n+m))\) 的。

注意到 \(m\) 超过 \(2n\) 时一定有解,所以可以认为 \(n,m\) 同级,这样就得到了 \(O(n^3)\) 的做法。

接下来可以对 \(m\) 的上界做更精准的分析。

可以证明,如果无解,\(m\leq n+2\sqrt{n}\)

证明:

考虑随以 \(p\) 的概率删掉图中每条边。

剩下的图中环的期望个数不超过 \(\sum\limits_{i=3}^{n} (1-p)^i\leq \frac{1}{p}\)

也就是说,期望删去不超过 \(np+\frac{1}{p}\) 条边能让图无环。

所以如果无解,那么一定存在一种方法能删去不超过 \(np+\frac{1}{p}\) 条边使得图无环。

\(p=\dfrac{1}{\sqrt{n}}\) 能得到无解时 \(m\leq n+2\sqrt{n}\)

这样取 \(O(\sqrt{n})\) 个非树边的端点构成的虚树,带权跑上面的暴力就能得到 \(O(n^{1.5})\) 的做法了。

上面是假话,考虑缩掉一些点之后依然有 \(n\) 种环长,每次搜索的复杂度是 \(O(n)\) 的,所以能得到复杂度上界是 \(O(n^2)\)

好像原数据判掉 \(m\) 的上界后直接爆搜卡时就能过,但这很好卡。

11.8 D

我是奶龙。

首先注意到 \(R(x)\) 最多是 \(x\)\(k\) 倍。

先枚举倍率,数位 dp,每轮填前后两个数,需要记一下进位和被进位的量以及前缀与 \(n\) 的大小关系。

需要特殊 check 一些长度与 \(n\) 相等且 LCP\(\ge \dfrac{n}{2}\) 的 case。

11.4 D

给定一个序列,支持前缀加,求最大值

类似 P10181。

使用链表并查集做到 \(O(\alpha(n))\)

CF1630F Making It Bipartite

注意到整除有传递性,所以剩下的图确定每个点属于左部(倍数)还是右部(因数)之后,不存在入度出度都大于 0 的点。

给每个点钦定属于二分图的左部还是右部,可以转化成有向图最大独立集。

也就是把一个点 \(u\) 拆成 \(u_1,u_2\) 两个点,给 \((u_1,u_2)\) 连边,再对于所有 \(u\) 的倍数 \(v\),给 \((u_1,v_1),(u_2,v_2),(u_1,v_2)\) 连边。

这是一个传递闭包的有向图。此时最大独立集即为最长反链,由 Dilworth 定理,最长反链等于最小链覆盖,最小链覆盖可由最大匹配得出。

由于有多测,复杂度看起来比较大,但似乎是能跑的。

Dilworth 定理

偏序集可以认为是有传递性的 DAG。

偏序集的一条链是一个有全序关系的子集。

偏序集的一条反链是一个元素两两无偏序关系的子集。

偏序集的一个链划分指把每个元素划分到恰好一条链中,链的个数成为该链划分的大小。

Dilworth 定理指出:

  • 偏序集的最小链划分大小等于最长反链。

存在很多证明方式。

一种按拓扑序增量归纳的证明

一种直接对偏序集大小归纳的证明

可以把最小链划分转化成最大匹配做。

需要注意,一般的 DAG 可能不具备传递性,常规意义上的最大独立集应该是做不了的。

偏序集最长反链

P4298 [CTSC2008] 祭祀

直接暴力向当前的最长反链加点构造需要跑 \(n\) 次 flow。

存在一种只跑一次 flow,并且剩余部分线性的做法,不懂啊/kel。

\(n\) 元集合偏序集的最长反链

最多选多少个 \(n\) 位二进制数,满足它们互不包含。

可以证明最多选 \(\dbinom{n}{n/2}\) 个(见 Sperner 定理)。

可以用于一些二进制分组(扣掉一个位置之后其他位置的可重半群信息和之类的事)的常数优化。(主要用于交互题)

\(2\log_2{n}\) 优化至 \(\min(m|\binom{m}{m/2}\ge n)\)

CF1305G Kuroni and Antihype

转化后发现要跑类似最大树形图的东西。

对于这种边权是父亲点权的最大树形图(外向树),一个拆贡献的 trick 是:

注意到每个点父亲唯一(根除外),所以可以把边权设置成两端点点权和,求出最大生成树后减去所有点的点权(除根外)。

这个题暴力做 MST 似乎能过(\(O(a^{1.585})\))。

更对的做法是 Boruvka,还需要个高维前缀和,信息是最大值和与最大值不在一个连通块内的次大值,复杂度 \(O((n+a)\log n\log a)\)

11.11 C

给定 \(k\),构造一个排列,使其恰好有 \(k\) 个 LIS,要求排列长度 \(\leq 289\)

\(k\leq 10^{35}\)

这种“恰好 \(k\) 个”的构造常常先考虑如何造出比较大的答案,再考虑构造一些贡献独立的结构,把 \(k\) 拆成 \(2\) 的次幂。

首先发现构造形如 2,1,4,3,6,5,8,7... 的序列能得到 \(2^{n/2}\) 个 LIS。

假设当前排列长为 \(n\),注意到如果 \(k\) 二进制下第 \(i\) 位为 0,就在第 \(2i,2i+1\) 个位置之间插入一个 \(n+i+1\);否则在第 \(2i+1,2i+2\) 个位置之间插入 \(n+i+1\)。这样恰好可以构造出 \(k\) 个 LIS。

现在需要 \(3\log_2k\) 步。

可以发现把 \(2\) 进制换成 \(t\) 进制也是能用 \(t+1\) 个点构造一位的。

也就是说可以把 \(k\) 拆成若干位,第 \(i\) 位是 \(a_i\) 进制的,构造需要 \(\sum(a_i+1)\) 个点。

可以 dp 出来一个 \(\sum(a_i+1)=291\) 步的方案,加个剪枝就能 \(\leq 289\) 了。

11.11 D

树上每个点点权取自 \([0,r_i]\),求每个点子树内点权和是 \(m\) 的倍数的方案数。

\(nm\leq 10^7\)

\(r_i\leq 10^9\)

\(n,m\leq 10^5\)

朴素的树上背包绕不开循环卷积,但是向背包内加一个点可以 \(O(m)\) 做。

因此考虑算一个点答案的时候直接把其子树内的点一个一个加进来。这样复杂度是 \(O(m\sum |subtree|)=O(n^2m)\) 的。

使用 dsu on tree 优化能做到 \(O(nm\log n)\)

存在 \(\log \min(n,m)\) 的做法。

一个相关的问题是:[ABC311Ex] Many Illumination Plan,如果直接套用上面的做法,会在向加入轻子树的过程中丢掉祖先的颜色信息,这个题指出了一种高效的处理方式。

P10681 [COTS 2024] 奇偶矩阵 Tablica

直接 dp 是 \(O(n^3)\) 的,看上去不太能继续做,考虑直接计数。

考虑如果确定每行每列填了一个还是两个 1,如何数合法的方案数。

对于每个 1,把它所在的行号构成的序列任意排列,然后从第一列开始,如果这一列填了一个 1,就向后取一个数,否则向后取两个数,要求这两个数不能相同。这样就能算出来合法的方案数 \(\times 2^{\text{\#有两个 1 的列}}\)

考虑枚举一维(比如行)的状态,可以发现只关心填一个 1 的行数 \(a\),那么剩下 \(n-a\) 行填了两个 1。此时能确定恰好 \(k=2n-m-a\) 列填了两个 1。

为了处理一列选的两个行号不能相同,考虑容斥。

钦定有 \(i\) 列两个行号相同,那么把这 \(2i\) 个行号提出来,剩下 \(2n-a-2i\) 个行号任意排,再把 \(k-i\) 个填两个 1 的列分给剩下 \(m-i\) 列就能唯一确定这 \(2i\) 个行号要插入到哪里。

此外还要处理 \(\times 2^{\text{\#有两个 1 的列}}\) 这个系数。可以假装剩下 \(k-i\) 个填两个 1 的列的两个行号不同,方案数乘上 \(\dfrac{1}{2^{k-i}}\)

那么能得到容斥系数 \(f\) 满足:

  • \(f_0=1\)

  • \(f_i=-\sum\limits_{0\leq j<i} \dbinom{i}{j}f_j\dfrac{1}{2^{i-j}}\)

时间复杂度 \(O(n^2)\)

P5290 [十二省联考 2019] 春节十二响

发现菊花的答案就是根加上点权最大的儿子。

而根在中间的链是把两边的节点“匹配”起来。

来考虑怎么合并两个子树的答案序列。

如果要把 \(a\) 合并到 \(b\),贪心地从大往小考虑 \(a\) 中的元素 \(x\),如果 \(b\) 中还存在一个大于它的元素 \(y\),就把 \(x\) 并入 \(y\);否则如果 \(b\) 中还存在一个小于它的元素 \(y\),就把 \(y\) 并入 \(x\)。注意实现时 \(b\) 中每个元素只能被操作 1 次。

容易发现这样在局部做是最优的,似乎还能感受到它偏序了其他所有方案。

也可以这么理解:对于任意 \(x\),把 \(\ge x\) 的数记作 1,\(<x\) 的数记作 0,那么这样贪心合并能保证合并完 1 的个数取到下界。

实现的时候用 set 维护子树序列,启发式合并。

注意到如果是启发式合并,每访问到一个元素就一定会造成删除一个元素,所以复杂度其实是 \(O(n\log n)\) 的。

CF2085F Serval and Colorful Array

假设确定了选哪 \(k\) 个数,那么一定是让它们向中位数靠拢。但是并不是所有数都要移动到中位数的位置,实际上答案要偏移一个常数 \(C\)

所以贡献也就是 \(\sum|p_i-x|-C\),其中 \(p_i\) 是第 \(i\) 个数选的位置,\(x\) 是中位数位置。

直接做是不好做的,考虑枚举 \(x\),每种数都取离 \(x\) 最近的那个,能得到 \(x\) 固定时上式的最小值,这可以 \(O(n)\) 算出每个 \(x\) 处的最小值。

这样做是正确的,可以理解为 \(\min\limits_{p}\min\limits_{x}\sum|p_i-x|-C\) 交换 \(\min\) 的顺序。

11.15 D

每一位独立的情况是好做的。

发现一个数和它的 \(l_i,r_i\) 的 lcp 往后的部分是可以乱填的。

所以可以按照整个序列最大的 lcp 的位置划分成两个区间递归下去做。

因此区间 dp,枚举 lcp 最大的位置和 lcp 长度即可,需要记很多 0/1。

把枚举 lcp 长度换成每次转移一步可以做到 \(O(n^3m)\)

11.13 D

CF2165D

一个点向其可能的后继连边,可以得到一个偏序集。

问题是求其最小路径覆盖,可以变成最大匹配。

上面好像是假话。

反正这个二分图形态比较特殊,扫描值域贪心地匹配即可。

CF2165F

考虑计算出来每个位置作为 '5' 能取到的最大的左端点。

按值域从小往大枚举 '3',那么可以发现只需要考虑它后面第一个比它大的位置作为 '5'。

现在确定了 '3' 和 '5',可以发现 '1,2' 的大小限制只和 '3' 有关,所以可以找到位置最大的 '4',然后找它前面 '2' 的位置最大的 '1,2' 对即可。

上面说的所有东西都能 \(O(n\log n)\) 维护出来。

[ICPC 2025 Xi'an R] Epilogue of Happiness

好大的 DS。

首先发现如果我们能以 \(O(n^{1+c})\) 的复杂度解决序列上这个问题,那么带权树剖拆贡献后也可以以相同的复杂度解决树上这个问题。

所以现在问题变成,有值域为 \([1,n]\) 的序列 \(p\) 和若干次询问 \([l,r,x]\)。每次询问初始 \(o_i=0\),对于 \(i\in[l,r]\),将 \(o_1,o_2,\cdots,o_{p_i}\) 这个前缀 flip,最后查询 \(\sum\limits_{1\leq i\leq x} a_io_i\)

一个直接的想法是莫队,再使用一个序列分块后就变成有 \(O(n\sqrt{n})\) 次前缀翻转和 \(O(n\sqrt{n})\) 次全局求和。这似乎不容易低于 \(O(\log n)-O(1)\),不太有前途。

然后呢呢???????

11.18 D

hyx 老师还在喂/ll/ll/ll

好编但是特别难写吧。

\(f_{u,0}\) 表示以 \(u\) 为根的连通块只有 \(a_u,a_{fa_u}\) 两种颜色的方案数。

\(f_{u,x},x\neq a_u,x\neq a_{fa_u}\) 表示以 \(u\) 为根的连通块只有 \(a_u,a_{fa_u},x\) 三种颜色的方案数。

\(g_u\) 表示以 \(u\) 为根的连通块只有 \(a_u\) 和异于 \(a_u,a_{fa_u}\) 的两种颜色共三种颜色的方案数。

这样已经能覆盖所有情况了。

还有一个性质是如果 \(u\) 的儿子 \(p\) 满足 \(a_p\neq a_{fa_u}\),那么枚举 \(f_{p,x}\) 的总复杂度是 \(O(n)\) 的。

综合上面的事情,就能用哈希表维护 \(f_{u,x}\) 转移了,似乎可以维护一些整体 tag 并启发式合并做到 \(O(n\log n)\),但是我写的代码复杂度不是很对也过了/yun/yun/yun 转移真的很一坨,似乎大家的做法都要讨论很多 case。

稍微写一些转移的大体思路:

首先 \(f_{u,0}\) 的转移是好做的。

然后是 \(g_{u}\),发现只会用到 \(a_p\neq a_{fa_u}\) 的儿子 \(p\),因此可以利用性质,暴力枚举 \(f_{p,1}\)。每个儿子可以取 \(f_{p,0}\)\(f_{p,x}\)。首先是所有都取 \(f_{p,0}\) 的情况,这个可以把所有 \(a_p\) 相等的儿子放在一类里,贡献就是选两类的权值乘起来。如果存在一个儿子取 \(f_{p,x}\),那么所有颜色就确定了,相当于把第一类的系数改一改,需要乘法逆元。这部分是线性复杂度的(除去逆元)。

最后是转移 \(f_{u,x}\)。考虑一个儿子一个儿子加,需要讨论 \(a_p\) 是否等于 \(a_{fa_u}\)。操作都是全局乘、枚举 \(f_{p,x}\)\(f_{u,x}\) 贡献。第二类操作可能可以启发式合并做到 \(O(n\log n)\) 的复杂度。

不想优化了,摆了。

11.19 D

现有一长为 \(n\) 的序列,对每个 \(k\in [1,n]\),求把这个序列划分成 \(k\) 段的权值和的最小值。

一个段 \([l,r]\) 的权值 \(w(l,r)\) 由交互库给出。

保证 \(w(l,r-1)+w(l+1,r)\leq w(l,r)+w(l+1,r-1)\)

保证 \(w(1,n)\leq 2n\)

\(n\leq 10^5\),要求询问次数 \(O(n\log n)\)

提交链接,感觉挺 educational,似乎可以用来做很多问题。

相关题目:Welcome to Tokyo!

直接按照决策单调性和 wqs 二分的做法应该不太好低于 \(O(n\sqrt{n}\log n)\) 的复杂度和询问次数。

考虑四边形不等式告诉我们 \(w(l,r)+w(l+1,r-1)-w(l+1,r)-w(l,r-1)\ge 0\),也就是四边形不等式等价于权值矩阵从右下角开始的二维差分矩阵是非负的。

记差分矩阵是 \(f(l,r)\),那么有 \(w(l,r)=\sum\limits_{L\ge l}\sum\limits_{R\leq r} f(L,R)\)

结合 \(w(1,n)\leq 2n\) 可知这个差分矩阵里所有项的和 \(\leq 2n\),所以差分矩阵中非零的位置只有 \(O(n)\) 个,这些位置通过二分可以 \(O(n\log n)\) 次询问找出。

所以问题可以转化成有 \(O(n)\) 个区间(下称输入的区间),一段的代价定义为被其包含的给定区间的数量,对每个 \(k\) 求出划分的最小代价。

考虑划分中每个段的右端点集合 \(S\),一个输入的区间 \([l,r]\) 不被一端包含相当于 \(\exists x\in S,x\in[l,r-1]\)

所以说除去选 \(n\) 作为右端点,并把输入的区间 \(r\gets r-1\),问题还可以变成:选 \(k-1\) 个点,最多有多少个输入的区间包含至少一个点。

这可以写成线性规划。(下面部分可能公式不严谨)

\(x_i\) 表示第 \(i\) 个点是否被选,\(s_i\) 表示区间是否包含至少一个点。

那么限制可以写成:

  • \(0\leq s_i\leq 1\)
  • \(s_i\leq \sum\limits_{l_i\leq j\leq r_i} x_j\)
  • \(\sum\limits_{1\leq i\leq n} x_i \leq k\)

要最大化 \(\sum s_i\)

由于某些原因,这个线性规划最优解一定取在 \(x,y\in \{0,1\}\) 时 。

对偶之后得到限制:

  • \(\forall x\in[1,n],t-\sum\limits_{i} [l_i\leq x\leq r_i]p_i\ge 0\)
  • \(p_i+v_i\ge 1\)

最小化 \(kt+\sum\limits_{i} v_i\)

发现 \(p_i+v_i> 1\) 时不优,所以认为 \(p_i+v_i=1\)。因此可以改写成:满足 \(t=\max\limits_{x} \sum\limits_{i} [l_i\leq x\leq r_i]p_i\),最小化 \(kt-\sum\limits_{i} p_i+C\)

猜测 \(p_i\) 只会取 01,那么能编出来一个意义:选 \(u\) 个区间保留,设 \(q\) 为被覆盖次数最大的位置被覆盖的次数,最小化 \(kq-u\)

这可以贪心地解决。

枚举 \(q\),不断加入右端点最小的区间使得加入后 \(q\) 不增大,容易看出 \(q=t+1\) 时的方案能继承 \(q=t\) 时的方案。

使用线段树维护这个过程,时间复杂度 \(O(n\log n)\)

posted @ 2025-11-05 12:14  zzafanti  阅读(54)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end