platelet's blog

精于心,简于形

Codeforces 题解

初三和高一写的,平均难度 2800 左右。

题号 tags
CF1515G dfs and similar, graphs, math, number theory
CF521E dfs and similar, graphs
CF549F data structures, divide and conquer
CF1144G dp, greedy
CF1305G bitmasks, brute force, dp, dsu, graphs
CF1430F dp, greedy
CF1498E brute force, graphs, greedy, interactive, sortings
CF1508C bitmasks, brute force, data structures, dfs and similar, dsu, graphs, greedy, trees
CF1516E combinatorics, dp, math
CF1515F constructive algorithms, dfs and similar, dsu, graphs, greedy, trees
CF1519E constructive algorithms, dfs and similar, geometry, graphs, sortings, trees
CF1498D dfs and similar, dp, graphs, implementation
CF1498F bitmasks, data structures, dfs and similar, dp, games, math, trees
CF493E math
CF868E dp, graphs, trees
CF555E dfs and similar, graphs, trees
CF845F bitmasks, dp
CF908G dp, math
CF1548D2 brute force, geometry, math, number theory
CF1548E data structures, divide and conquer, graphs, greedy, math
CF1562E dp, greedy, string suffix structures, strings
CF1562F interactive, math, number theory, probabilities
CF566C dfs and similar, divide and conquer, trees
CF1149C data structures, implementation, trees

CF1515G Phoenix and Odometers

给定一张 nn 个点 mm 条边的带权有向图。

qq 次询问,每次给定 v,s,tv,s,t,问是否存在一条起点终点都为 vv 的路径满足 t(s+l)t | (s+l),其中 ll 是路径的总长。

n,m,q2×105,0s<t109n,m,q \le 2 \times 10^5,0\le s<t\le 10^9,边权均不超过 10910^9

首先这条路径只能在 vv 所在强连通分量的内部。

以下所有的路径长度都是在模 tt 意义下的。

引理:在同一个强连通分量,如果 uvu\rightarrow v 存在一条长度为 ll 的路径,那么 vuv\rightarrow u 存在一条长度为 l-l 的路径。

构造:根据强连通性 vuv\rightarrow u 存在一条路径,设它的长度为 ww,先走 vuv\rightarrow u,长度为 ww,再走 t1t-1uvuu\rightarrow v\rightarrow u,长度为 (t1)(l+w)(t-1)(l+w),总长度 l-l

在强连通分量的内部,对于一个长度为 ww 的环,从 环上 一个点 uu 出发绕若干圈再回到 uu,所有可能的路径长度为 gcd(w,t)\gcd(w,t) 的倍数。根据引理,对于任意一个点 vv,先走 vuv\rightarrow u,再绕若干圈,最后走 uvu\rightarrow v,就可以凑出所有长度为 gcd(w,t)\gcd(w,t) 倍数的环。

rr 为根建出 DFS 树,设 φ(u)\varphi(u) 表示从 rr 沿着树边走到 uu 的路径长度,对于每条非树边 (u,v,w)(u,v,w),意味着存在一个长度为 φ(u)+wφ(v)\varphi(u)+w-\varphi(v) 的环。设 x=gcd(u,v,w)φ(u)+wφ(v)x=\gcd_{(u,v,w)}\varphi(u)+w-\varphi(v),那么所有的可能环长分别为 0,x,2x,3x,0,x,2x,3x,\cdots。这些环长显然能取到,也可以归纳证明对于任何 rur\rightarrow u 的路径,都有长度 φ(u)(modx)\equiv \varphi(u)\pmod x。结论:存在合法路径当且仅当 xsx|s

复杂度 O(n+m)O(n+m)

CF521E Cycling City

给定一张 nn 个点 mm 条边的简单无向图。

问在图中能否找到两个点,满足这两个点之间有至少三条点不相交的简单路径,有解要打印三条路径。

n,m2×105n,m \le 2 \times 10^5 不保证图连通。

考虑 uvu \rightarrow v 有三条点不相交的路径会是什么样子,发现有两个环相交了。

反过来,如果任意两个环都不相交,即仙人掌,那就无解。

至此,得到了有解的充要条件:不是仙人掌。

但为了便于打印路径,采用另一种方法。

lowulow_u 为 tarjan 算法中的定义,LowuLow_u 表示次小值。

如果 Lowu=dfnuLow_u = dfn_u,则子树内的一个点到子树外的一个点至多有两条点不相交的简单路径。

于是存在满足 Lowu<dfnuLow_u < dfn_u 的点 uu 是有解的必要条件。

观察这张图,如果 lca(v,V)=ulca(v,V)=u,那么 uLowu \rightarrow LowuvlowLowu \rightarrow v \rightarrow low \rightarrow LowuVLowu \rightarrow V \rightarrow Low 是三条点不相交的简单路径。

只要以 uu 为根的子树中只有 uu 一个点满足 Lowu<dfnuLow_u < dfn_u,则 lca(v,V)=ulca(v, V) = u

在 dfs 过程中第一次找到满足 Lowu<dfnuLow_u < dfn_u 的点 uu 即符合上一行的条件,因为它是子树中最后判定的点。

复杂度 O(n)O(n)

CF549F Yura and Developers

给定一个长度为 nn 的序列和数 kk,求有多少长度大于 11 的区间满足和减最大值是 kk 的倍数。

n3×105,k106,ai109n \le 3 \times 10^5,k \le 10^6,a_i \le 10^9

先求出前缀和数组 prepre

则条件可以写成 prerprel1+max(modk)pre_r \equiv pre_{l-1} + \max \pmod k

ii 插入 vector[preimodk]\text{vector}[pre_i \bmod k],通过二分可以快速查询区间中有多少前缀和模 kkxx

求出整个序列的最大值的位置为 xx

然后枚举 xx 左边的前缀和,查询 xx 右边有多少个前缀和与之配对。

因为 xx 的位置不确定,所以这样是 O(n2logn)O(n^2\log n)

但如果每次枚举左右中较短的一段,则复杂度可降为 O(nlog2n)O(n \log^2 n)

其实不用真的分治,只需要单调栈求出每个位置作为最大值的极大区间即可。

CF1144G Two Merged Sequences

给定一个长度为 nn 的序列 AA

问能否把它拆成一个严格递增序列和一个严格递减序列,如果有解则输出方案。

n2×105n \le 2 \times 10^5

fi,0f_{i,0} 表示把序列的前 ii 个数拆成一个递增序列和一个递减序列(可以为空),并且 AiA_i 属于递增序列时,递减序列结尾可能的最大值。fi,1f_{i,1} 表示 AiA_i 属于递减序列时,递增序列结尾可能的最小值。

转移有四种:

  • Ai1,AiA_{i-1},A_i 都属于递增序列,条件是 Ai1<AiA_{i-1} < A_i,转移为 fi1,0fi,0f_{i-1,0} \rightarrow f_{i,0}
  • Ai1,AiA_{i-1},A_i 都属于递减序列,情况类似。
  • Ai1A_{i-1} 属于递减序列,AiA_i 属于递增序列,条件是 fi1,1<Aif_{i-1,1} < A_i,转移为 Ai1fi,0A_{i-1} \rightarrow f_{i,0}
  • Ai1A_{i-1} 属于递增序列,AiA_i 属于递减序列,情况类似。

为了输出方案,记 gi,0g_{i,0} 表示在最优方案中 Ai1A_{i-1} 属于哪个序列,gi,1g_{i,1} 同理。

实现中可以用 pair <int, int>fg 数组压一起。

CF1305G Kuroni and Antihype

一张有 nn 个点的图,每个点的点权为 aia_i

uu 和点 vv 连边当且仅当 au&av=0a_u \& a_v = 0

对于点 uu,有两种操作:

  • 直接涂黑,无贡献。
  • 找一个与 uu 相邻且已经涂黑的点 vv,再涂黑 uu,贡献为 ava_v

求涂黑所有点的最大贡献。

n2×105,ai2×105n \le 2 \times 10^5,a_i \le 2 \times 10^5

首先加入一个点权为 00 的虚点,且初始为黑,则两种操作就可以统一成第二种。

对于每次操作,就从 uuvv 连一条有向边,得到一个以 00 为根的有根树。

设点 uu 的度数为 degreeudegree_u,则总贡献可以表示为

uVau(degreeu1)=uVaudegreeuuVau=(u,v)Eau+avuVau\sum_{u \in V}a_u(degree_u-1)=\sum_{u \in V}a_udegree_u-\sum_{u \in V}a_u = \sum_{(u,v) \in E}a_u + a_v - \sum_{u \in V}a_u

如果定义 (u,v)(u,v) 边权为 au+ava_u + a_v,则前一部分为生成树权值,后一部分是定值。

所以问题转化为求最大生成树。

先考虑所有点的点权两两不同。

根据枚举子集的经典结论,边的总数小于 3183^{18},但实际只有一半左右,即 1.7×1081.7 \times 10^8 左右。

考虑 Kruskal 算法,虽然并查集复杂度要乘一个 α(n)\alpha(n),但感觉卡不满。

首先不可能存下所有边,更不可能排序,所以考虑从大到小枚举边权。

注意到 u,vu,v 连边当且仅当 au&av=0a_u \& a_v = 0,而边权为 au+ava_u + a_v

直接枚举边权的子集就可以得到两个端点。

剩下的正常做 Kruskal 就行了。

复杂度 O(318α(n))O(3^{18}\alpha(n))

点权相同时

当枚举到 au,ava_u,a_v 时,aua_u 可能会对应很多的 uu,设这些 uu 构成集合 UUava_v 也会对应很多的 ava_v,设这些 vv 构成集合 VV

任何一个 UU 中的结点和任何一个 VV 中的结点都有权值相等的连边,边太多了。

考虑一个等价的连边:

UU 中选择一个代表元 u0u_0,同理选个 v0v_0u0u_0v0v_0 连边,u0u_0UU 中其他点连边,v0v_0VV 中其他点连边。

对于后两种连边,每个集合只用在第一次访问到时进行,复杂度 O(318α(n))O(3^{18}\alpha(n))

UPD:复杂度不带 O(318α(n))O(3^{18}\alpha(n)),当并查集的 find 的次数不少于 nlognn\log n 时,均摊复杂度为 O(1)O(1)

CF1430F Realistic Gameplay

你有一把枪,枪的弹匣量为 kk

nn 波怪物,对于第 ii 波,你必须在 [li,ri][l_i,r_i] 时间内消灭 aia_i 只怪物 (rili+1)(r_i \le l_{i+1}),你可以在任意时刻打出一发子弹击杀一只怪物且不耗费时间。你每次换弹都需要将弹匣(包括里面的子弹)扔掉,并花费 1 单位的时间。

在保证通关的情况下,需要的最少的子弹数为多少。

n2000,k109,liri109,ai109n \le 2000,k \le 10^9, l_i \le r_i \le 10^9,a_i \le 10^9

考虑什么时候会换弹,要么是当前子弹打完了,而这波怪还没打完,称之为一类换弹;要么是当前这波怪已经打完了,但为了通关而换新弹匣 ,称之为二类换弹。

如果所有二类换弹在哪一波都是确定的,只要按时间线扫描一遍就可以算出所有一类换弹的时间。

因此设 fif_i 表示打完前 ii 波怪,且在第 ii 波进行一次二类换弹需要的最少的子弹数。
转移就从第 i+1i + 1 波开始扫描,同时维护当前弹匣中的子弹数,直到不合法为止。
如果在 rjr_j 之前消灭了第 jj 波的所有怪物,就可以在第 jj 波进行一次二类换弹后转移到 fjf_j
如果能消灭完所有怪就更新 ans

复杂度 O(n2)O(n^2)

CF1498E Two Houses

有一张 nn 个点的竞赛图。

不会给这张竞赛图,但会给每个点的入度 kik_i

还可以通过交互询问从 uu 能否到达 vv,但一旦回答了”是“,就不能再询问了。

定义一个点对 (u,v)(u,v) 的价值是 kukv|k_u-k_v|

求所有双向可达的点对中价值最大的一对,或者输出无解。如果有多对,输出任意一对。

n500n \le 500

做法一

考虑一对点 (u,v)(u,v),由于是竞赛图,u,vu,v 间有连边,不妨设 uvu \rightarrow v

如果 vv 不能到达 uuS,uSxS,y∉S,xy\exists S,u \in S \land \forall x \in S, y \not \in S,x \rightarrow y,即集合 SS 内的点全部向 SS 外的点连边。

kvS,ku<Sku<kv\therefore k_v \ge |S|,k_u < |S| \Rightarrow k_u < k_v

得到一个结论:如果一对点不双向可达,那么入度大的一定无法到达入度小的。

把所有点对按价值从大到小依次询问,每次询问入度大的能否到达入度小的,如果可以,就直接输出这一对。

如果到最后都没有回答“是”,那么输出无解。

复杂度 O(n2)O(n^2)

做法二

考虑拓扑序最小的几个强连通分量的并集 SSSS 内的点全部向 SS 外的点连边,所以 SS 内所有点的入度和等于 (S2)\binom {|S|}2反之亦然

把所有点按入度从小到大排序,如果前 mm 个节点的入度和等于 (m2)\binom m2,那么前 mm 个点一定是拓扑序最小的几个强连通分量的并集,并且不会漏掉,这样就可以分离出所有的强连通分量,直接统计答案即可。

复杂度 O(n)O(n),因为排序可以桶排,无需询问

UPD: 这个结论叫 兰道定理,练习题 「2021 集训队互测」基础图论练习题

CF1508C Complete the MST

有一张 nn 个点的无向完全图,其中 mm 条边的边权已给定。

你需要给剩下的边确定边权,使得所有边的权值异或和为 00

求出所有方案中最小生成树权值的最小值。

n2×105,mmin{2×105,(n2)1}n \le 2 \times 10^5,m \le \min\{2 \times 10^5,\binom n2-1\}

下面原图指给定的 mm 条边构成的图,补图指剩下的边构成的图,MST 指最小生成树。

引理:最优解中补图至多有一条权值非 00 的边。

证明:考虑两条补图边 e1,e2e_1,e_2,它们的权值 w1,w2w_1,w_2 都大于 00

  • 如果它们都不在 MST 上,把 e1e_1 权值变为 00e2e_2 权值异或上 e1e_1 权值,新的 MST 不会变劣。
  • 如果它们都在 MST 上,把 e1e_1 权值变为 00e2e_2 权值异或上 e1e_1 权值,因为 w1w2w1+w2w_1 \oplus w_2 \le w_1 + w_2,所以新的 MST 不会变劣。
  • 如果它们中的一条在 MST 上,一条不在,不妨设 e1e_1 在 MST 上,把 e1e_1 权值变为 00e2e_2 权值异或上 e1e_1 权值,新的 MST 不会变劣。

综上,如果存在两条权值大于 00 的边,把其中一条的权值变为 00,新的 MST 不会变劣。

所以补图中有一条特殊边的权值恰好为给定的 mm 条边的权值异或和,其余边的权值均为 00

容易想到枚举一下特殊边在不在 MST 上。

先用 DFS 求出补图的生成森林,用 set 优化枚举未访问的点可以做到 O(mlogn)O(m\log n) 的复杂度。

如果补图中存在环,那么补图中一定有边不在 MST 上,故特殊边一定不在 MST 上。把求出的生成森林加入原图后,答案即为该图的最小生成树,复杂度 O(mlogm)O(m\log m)

如果不存在环,那么 nn 就是 O(m)O(\sqrt m) 级别的,如果特殊边在 MST 上,直接用同样的做法;如果不在 MST 上,就需要枚举特殊边是哪一条,每次删去它再沿用以上做法,复杂度 O(mlogm+nmα(n))O(m \log m + nm\alpha(n))。一个优化:用原图的最小生成树替代原图,复杂度降为 O(mlogm+n2α(n))=O(mlogm)O(m\log m + n^2\alpha(n))=O(m\log m)

CF1516E Baby Ehab Plays with Permutations

给定 n,kn,k,对于每个 i[1,k]i \in [1,k],你需要求出有多少个长度为 nn 的排列能通过恰好 ii 次交换操作变成 {1,2,,n}\{1,2,\cdots,n\}

答案对 109+710^9+7 取模。

n109,k200n \le 10^9,k \le 200

先考虑这样一个问题:给定一个排列 PP,最少交换几次才能变成 {1,2,,n}\{1,2,\cdots,n\}

把排列 PP 理解成一个置换,并分解成循环,不难发现 ii 个元素的循环需要交换 i1i-1 次。

这样,如果 PP 的循环节为 xx,则总的交换次数为 nxn-x

涉及到点数和循环数不难想到第一类斯特林数

ii 的答案即 [nni]+[nni+2]+[nni+4]+{n \brack n-i}+{n \brack n-i+2}+{n \brack n-i+4} + \cdots

问题是 nn 太大了,不能递推求出第一类斯特林数。

由于 ii 次交换最多影响 2i2i 个元素,一个合法的排列 PP 至多有 2i2i 个位置 jj 满足 jPjj \ne P_j

可以枚举有多少个 jj 满足 jPjj \ne P_j,如果有 xx 个,对答案的贡献为 (nx)fx,xi\binom nxf_{x,x-i}

其中 fi,jf_{i,j} 表示有多少个长度为 ii错排循环节为 jj,它可以通过第一类斯特林数容斥得到:

fi,j=[ij]k=1j(ik)fik,jkf_{i,j}={i \brack j}-\sum_{k=1}^j\binom ikf_{i-k,j-k}

复杂度 O(k3)O(k^3)

CF1515F Phoenix and Earthquake

给定一张 nn 个点 mm 条边的无向连通图和正整数 xx,点有非负权值 aia_i

如果一条边 (u,v)(u,v) 满足 au+avxa_u+a_v \ge x,可以将 u,vu,v 缩起来,新点的点权为 au+avxa_u+a_v-x

判断这张图是否可以缩成一个点并给出方案。

n,m3×105,x,ai109n,m \le 3 \times 10^5,x,a_i \le 10^9

首先将每个点的点权减去 xx,则合并条件变为 au+avxa_u + a_v \ge -x,每次合并后新点的点权为 au+ava_u + a_v

结论:这张图可以缩成一个点的充要条件是点权和大于等于 x-x

必要性显然,充分性可以考虑这个构造:每次选择点权最大的点 uu 的任意一条边。

构造的正确性可以考虑反证法,设这条边为 (u,v)(u,v),假设这条边不行,即 au+av<xa_u+a_v<-x

进一步 avx,au<0\because a_v \ge -x,\therefore a_u < 0

由于 aua_u 是最大值,因此所有点的点权都是负数,那么 au+avaixa_u+a_v \ge \sum a_i \ge -x,推出矛盾!

至此,已经得到一个做法。

但还有更简单的做法,根据上面结论,任意求一棵生成树都有可行方案。

先从叶子向根依次考虑每个结点,如果这个结点权值非负,则选择它和它父亲的连边,再从根向叶子依次考虑每个结点,如果它和它父亲的连边还没选,则选择这条边。

证明考虑数学归纳法即可。

在实现中不必 DFS 两遍,DFS 过程中把没选的边压栈即可。

复杂度 O(n)O(n)

CF1519E Off by One

给定平面上的 nn 个点 (aibi,cidi)(\frac {a_i}{b_i},\frac {c_i}{d_i}),定义一个点 (x,y)(x,y)派生点为点 (x+1,y)(x+1,y) 和点 (x,y+1)(x,y+1)

两个点 A,BA,B 能够匹配当且仅当 AA 的一个派生点和 BB 的一个派生点在同一条过原点的直线上。

求出最大匹配的大小和任意一种方案。

n2×105,1ai,bi,ci,di109n \le 2 \times 10^5,1 \le a_i,b_i,c_i,d_i \le 10^9

两个第一象限的点在同一条过原点的直线上等价于两个点的横纵坐标之比相等。

定义一个点 (x,y)(x,y)派生值x+1y\frac {x+1}yxy+1\frac x{y+1}

两个点 A,BA,B 能够匹配即拥有同一个派生值。

把所有的派生值抽象成点,给定的点抽象成边,匹配条件进一步转化为两条边拥有公共顶点

引理:一个连通无向图能够给每条边定向使得每个点入度为偶数当且仅当边数为偶数。

证明:边数为奇数显然不行,下面给出边数为偶数时的构造:

先建树 DFS 树,所有反向边都向上,如果两个端点都在点 uu 子树内的边的数量为偶数,则 uu 与其父亲的连边(如果存在)向上,否则向下。

通过引理不难推出一个边数为 mm 的连通图的答案为 m2\lfloor \frac m2 \rfloor,求方案可以先给每条边定向,再把每个点的所有入边两两配对。

只需要对每个连通块做一遍即可。

最后一个问题:派生值是分子分母都是 101810^{18} 级别的分数,离散化时需要排序,但如何比较。

一种方法是转 __int128 交叉相乘比较大小。其实不一定要按分数值排序,双关键字排序同样能实现离散化,先约分,再以分子、分母为两关键字比较则是另一种更快的方法。

CF1498D Bananas in a Microwave

有一个变量 kk 初始为 00

对于时刻 i=1,2,3,,ni=1,2,3,\cdots,n,给定 ti,xi,yit_i,x_i,y_i,且执行以下操作:

  • ti=1t_i=1,选择 a[0,yi]a \in [0,y_i],执行 aak=k+xik=\lceil k + x_i \rceil
  • ti=2t_i=2,选择 a[0,yi]a \in [0,y_i],执行 aak=kxik=\lceil k \cdot x_i \rceil

其中 xix_i实数

对于每个 j[1,m]j \in [1,m],求可能的最小时刻使得 k=jk=j

n200,yim105n \le 200,y_i \le m \le 10^5

对于 ti=1t_i=1,有 0<xim0 < x_i \le m,对于 ti=2t_i=2,有 1<xim1 < x_i \le m

对于每个时刻 ii,维护数组 okjok_j 表示经过前 ii 个时刻能否使 k=jk=j

nextj={j+xi(ti=1)jxi(ti=2)next_j=\begin{cases}\lceil j + x_i \rceil&(t_i=1)\\\lceil j \cdot x_i \rceil&(t_i=2)\end{cases}

因为 jk,nextjnextk\forall j \ne k,next_j \ne next_k,所以 jnextjj \rightarrow next_j 连边后形成若干条链。

假设一条链上的结点分别为 v1,v2,v3,,vsv_1,v_2,v_3,\cdots,v_s

对于 vjv_j,如果 k[jyi,j)\exist k \in [j-y_i,j),满足 okk=1ok_k=1,那么在第 ii 时刻 kk 可以等于 vjv_j

对每条链扫描一遍即可求出在第 ii 时刻 kk 可以等于哪些值。

复杂度 O(nm)O(nm)

CF1498F Christmas Game

给定一棵 nn 个点的树和 kk,每个结点上有 aia_i 个物品,Alice 和 Bob 在上面玩游戏。

在确定根之后,两个玩家轮流选择任意一个存在 kk 级祖先的结点 uu,然后把 uu 的任意个物品移到 uukk 级祖先上。

最后没有物品可取的人输。

问当每个结点作为根时,谁必胜。

n105,k20,ai109n \le 10^5, k \le 20,a_i \le 10^9

k=1k=1 时,它几乎是一个阶梯 NIM 游戏

设根结点深度为 00,根据阶梯 NIM 游戏的结论,原问题等价于所有深度为奇数的结点做 NIM 游戏,即先手必胜当且仅当所有深度为奇数的结点的 aia_i 异或和不为 00

对于一般的情况,先手必胜当且仅当

depthuk is oddau0\bigoplus_{\big\lfloor \frac {depth_u}k \big\rfloor \text{ is odd}}a_u \ne 0

fu,if_{u,i} 表示以 uu 为根的子树里,所有满足 depthvdepthui(mod2k)depth_v - depth_u \equiv i \pmod {2k} 的结点 vv 的点权异或和。

然后换根 DP 一下即可。

复杂度 O(nk)O(nk)

CF493E Vasya and Polynomial

原题题意:给你三个正整数 aabbcc,问多少个非负整系数多项式 FF, 满足 F(a)=bF(b)=cF(a)=b \land F(b)=c

1a,b,c10181 \le a, b, c \le 10^{18}

a=1,b=1a=1,b=1 答案显然。

否则因为非负整系数的限制,多项式系数是 log\log 级别的。

我们考虑一个更一般的问题:问多少个非负整系数多项式 FF, 满足

F(a)=xF(b)=yxbF(a)=x \land F(b)=y \land x \le b

FF 的常数项为 VV

根据 F(a)=xF(a)=xF(b)=yF(b)=y 知道 Vx,Vy (mod b)V \le x, V \equiv y\ (mod\ b)

分两种情况。

  1. x=bb  yx=b \land b\ |\ y 时,则 V=0V=xV=0 \lor V=x

    V=xV=x,因为 F(a)=xF(a)=x, 所以 FF 只能是常函数 F(x)=VF(x)=V,当 xyx \ne y 时无解。

    另一种情况,因为 F(a)V=xVF(a)-V=x-V,所以 aa 要能整除 xVx-V,如果不整除就无解。

    否则令 G(x)=F(x)VxG(x)=\dfrac{F(x)-V}x,有 G(a)=xVa,G(b)=yVbG(a)=\dfrac{x-V}a,G(b)=\dfrac{y-V}b

    显然 xVaxb\dfrac{x-V}a \le x \le b,因此就转化为了一个子问题。

  2. x<bb∤ yx < b \lor b \not |\ y 时,显然 V=ymodbV=y \mod b,可以转化为子问题。

边界条件是 xy=0xy=0, 这意味着无解(F(x)=0F(x)=0 不算合法)。

然后就可以求出多项式的数量了。

如何求次数最高的前提下字典序最小的多项式?

分析递归过程,每个次数的合法多项式最多一个,递归时优先选择次数高的就行了。

CF868E Policeman and a Tree

一棵 nn 个结点的边带权树,有一个警察初始在 ss 点,速度为 11,树上分布有 mm 个罪犯,速度为任意大,如果罪犯和警察在同一个结点就会被干掉,警察希望干掉所有罪犯的时间尽量短,而罪犯希望最大化这个时间,假设每个人都以最优策略行动,求这个时间。

1n,m,wi501 \le n, m, w_i \le 50wiw_i 为边权。

所有罪犯初始不在 ss 点,一个结点可能会有多个罪犯。

状态设计

考虑这个过程是怎样的。

当警察在结点 11 时,由于罪犯速度任意大,但不能经过警察,所以罪犯分布在被结点 11 隔开的三个部分中,并且可以在所属部分的任意位置上,不妨假设罪犯全部分布在所有与结点 11 相邻的结点 2,3,42,3,4 上。

图上的红数字表示该结点上有多少名罪犯。

当警察从结点 11 走到结点 44 时,结点 44 上的两名罪犯就需要走到结点 5,65,6 ,同时结点 2,32,3 上的两名罪犯可以一起走到结点 11

容易想到用警察所在的结点 uu 和所有与结点 uu 相邻的结点上分别有多少名罪犯来表示一个状态。
但一个结点的度数是 O(n)O(n) 级别的,因此状态数爆炸。

另一个描述状态的想法是警察当前在哪条边上,这条边的两端分别有多少名罪犯。
然后状态数就减少成了 O(n3)O(n^3),非常少。

因此我们用 fi,j,kf_{i,j,k} 表示当前总共还剩 ii 名罪犯,警察刚走上 j=uvj = u \rightarrow v 这条有向边(警察和 uu 的距离忽略不计),结点 vv 上有 kk 名罪犯。

转移

假设当前总共还剩 ii 名罪犯,警察在有向边 j=uvj = u \rightarrow v 上,边权为 ww,结点 vv 上有 kk 名罪犯。

如果结点 vv 是叶子结点,显然

fi,j,k=fik,jˉ,ik+wf_{i,j,k}=f_{i-k,\bar j,i-k} + w

其中 jˉ\bar jjj 的反向边。

另一种情况:

结点 44 上的 kk 名罪犯必须要分为两波,其中 aa 名跑到了结点 55bb 名跑到了结点 66
警察会下一步会在 454 \rightarrow 5464 \rightarrow 6 中选择较优的一条有向边。

罪犯为了最大化时间:

fi,14,k=maxa+b=kmin{fi,45,a,fi,46,b}+wf_{i,1 \rightarrow 4,k} = \max_{a+b=k}\min \lbrace f_{i,4 \rightarrow 5,a},f_{i,4 \rightarrow 6,b}\rbrace + w

一般地,设结点 vvuu 以外的相邻点分别为 a1,a2,a3,,ada_1,a_2,a_3,\cdots,a_d,则转移方程为:

fi,j,k=maxc1+c2++cd=kmins=1dfi,vas,cs+wf_{i,j,k}=\max_{c_1+c_2+\cdots+c_d=k}\min_{s=1}^df_{i,v \rightarrow a_s,c_s} + w

下面给出一种复杂度比较优秀的贪心算法实现第二种转移:

引理:若求 fi,j,kf_{i,j,k} 时的决策c1,c2,,cdc_1,c_2,\cdots,c_d
那么求 fi,j,k+1f_{i,j,k+1} 时的决策 cˉ1,cˉ2,,cˉd\bar c_1,\bar c_2,\cdots,\bar c_d 一定是在 c1,c2,,cdc_1,c_2,\cdots,c_d 中的某个数 +1+1 得到的。
并且 +1+1 的这个 cxc_x 满足

fi,vax,cx+1=maxs=1dfi,vas,cs+1f_{i,v \rightarrow a_x,c_x+1}=\max_{s=1}^df_{i,v \rightarrow a_s,c_s+1}

证明:首先在总人数和位置相同的情况下,警察追的人越多,剩下的时间就越短。
fi,j,0fi,j,1fi,j,2fi,j,if_{i,j,0} \ge f_{i,j,1} \ge f_{i,j,2} \ge \cdots \ge f_{i,j,i}

考虑

xfi,j,kc1,c2,,cd,fi,va1,c1xfi,va2,c2xfi,vad,cdx\begin{aligned} \forall x \le f_{i,j,k}&\exists c_1,c_2,\cdots,c_d,\\&f_{i,v \rightarrow a_1,c_1} \ge x\\&f_{i,v \rightarrow a_2,c_2} \ge x\\&\cdots\\&f_{i,v \rightarrow a_d,c_d} \ge x \end{aligned}

由二分答案算法的 check 函数可知:若 mim_ifi,vaif_{i,v \rightarrow a_i} 数列中最后一个大于等于 xx 的位置,
m1+m2++mdkm_1+m_2+\cdots+m_d \ge k

而以这种决策的构造方式,一定有 c1m1,c2m2,,cdmdc_1 \le m_1,c_2 \le m_2, \cdots, c_d \le m_d,因此通过该决策得到的值一定不劣于 xx

因此可以用一个大根堆维护那个 xx,可以在 O(nlogn)O(n\log n) 的时间同时求出 fi,j,0,fi,j,1,,fi,j,if_{i,j,0},f_{i,j,1},\cdots,f_{i,j,i}

复杂度 O(n3logn)O(n^3\log n)

CF555E Case of Computer Network

给定一张 nn 个点 mm 条边的无向图和 qq 组有序点对 (si,ti)(s_i,t_i)

询问是否可以给每条边定向,使得所有的 sis_i 都能到达 tit_i

n,m,q2×105n,m,q \le 2 \times 10^5 不保证图连通,可能有重边。

先假设有解,尝试求出一组解,再判定这组解合不合法。

构造解

一个经典结论:

一个边双连通分量存在一种给每条边定向的方案,使之成为强连通分量

一个强连通分量把有向边变成无向边后成为边双连通分量

对于前者直接让树边向下,反向边向上即可。

对于后者考虑一条有向边的两个端点可以相互到达,推出这条边在一个简单环上。

把图中的边双全部定向成强连通分量,接下来只需要给所有定向,以使 sis_i 所在的边双能到达 tit_i 所在的边双。

其实无需求边双,只需求出哪些边是桥即可,由于此题有重边,tarjan 算法应当记录上一条边而不是父亲

建出 dfs 树,对于每组 (si,ti)(s_i,t_i),要求 sis_itit_i 路径上的桥由 sis_i 指向 tit_i

silcas_i \rightarrow lca 上的边 +1+1lcatilca \rightarrow t_i 上的边 1-1,树上差分转换为 sis_i+1+1tit_i1-1lcalca 处不变。

一条边的最终权值如果为正,则必须向上,为负则必须向下,为 00 则都可以。

判定

检验 silcas_i \rightarrow lca 上的边是否全部为正,lcatilca \rightarrow t_i 上的边是否全部为负。

upuup_u 表示从 uu 开始只经过非桥边和权值为的桥边能到达的深度最小的结点。

downudown_u 表示从 uu 开始只经过非桥边和权值为的桥边能到达的深度最小的结点。

如果 upsiup_{s_i}downtidown_{t_i} 中深度较大者是 sis_itit_i 的公共祖先 (si,ti)(s_i,t_i) 就合法,使用 dfs 序可判定。

复杂度 O(n)O(n)

CF845F Guards In The Storehouse

给定一个 n×mn \times m 的网格,有些位置是障碍,其他是空地。

在一个空地放灯可以照亮这个灯向右,向下第一个障碍前的所有方格。

求有多少种在空地上放灯的方案,使得最多 11 个空地没有被照亮,对 109+710^9+7 取模。

nm250nm \le 250

\land 是逻辑与,\lor 是逻辑或。

首先 nm250min{n,m}15nm \le 250 \Rightarrow \min\{n,m\} \le 15

如果 n<mn < m,就可以将行列转置,问题不变,但 m15m \le 15 了。

容易想到对每一行状压,状压一行中每个格子向上第一个障碍前是否有灯(即这个格子是否有向下的光)。

这样时间复杂度过高,感觉行不通,于是考虑压轮廓线,按照从上到下,从左到右的顺序放灯。

fia,b,Sf_{i\,a,b,S} 表示目前将要决定格子 i=(x,y)i=(x,y) 放不放灯,aa 表示从 ii 向左第一个障碍前是(11)否(00)有灯(即 ii 左边是否有向右的光),bb 表示有几个目前已决定有没有放灯的空地没有被照亮,而 SS 是压的是第 xx 行前 y1y-1 个格子和第 x1x-1 行后 my+1m-y+1 个格子上是(11)否(00)有向下的光。

图中的情况 a=0,b=1,S={0,0,1,0,1}a = 0, b = 1, S = \{0,0,1,0,1\}

转移就三种情况(先不考虑从一行最后一个格子转移到下一行第一个格子的情况):

  • 格子 ii 是障碍,那么它会挡住向右和向下的光,形式化地:

    a0,SS{y}a \rightarrow 0,S \rightarrow S \setminus \{y\}

    f[i][a][b][S] 转移到 f[nxt][0][b][~(~S | 1 << y)]

  • 格子 ii 是空地,在格子 ii 放灯,那么它会产生向右和向下的光。

    a1,SS{y}a \rightarrow 1,S \rightarrow S \cup \{y\}

    f[i][a][b][S] 转移到 f[nxt][1][b][S | 1 << y]

  • 格子 ii 是空地,不在格子 ii 放灯,那么还要考虑 ii 会不会被照亮。

    如果 a=1ySa=1 \lor y \in S,那么 ii 会被照亮,a,ba,bSS 都不变,否则 ii 不会被照亮, bb 必须为 0,转移后变为 11aaSS 不变。

ii 是一行最后一个格子时,唯一区别是转移后 aa 变为 00,因此在代码里无需单独讨论。

答案就是格子 (n+1,1)(n+1,1) 的所有 f 值之和,因为状态的定义是目前将要决定这个格子放不放灯。

CF908G New Year and Original Order

定义 S(x)S(x) 表示把 xx 各数位上的数排序后得到的新数,S(353594)=334559S(353594)=334559

给定 nn,求 i=1nS(i)mod109+7\sum\limits_{i=1}^nS(i) \bmod 10^9+7

n10700n \le 10^{700}

nn 总共 mm 位,hx,ih_{x,i} 表示 xx 有多少个数位上的数大于等于 ii

然后发现 S(x)=i=191111=19i=1910hx,i1=19i=19j=0m(10j1)k=1n[hk,i=j]S(x) = \sum\limits_{i=1}^9 \underbrace{111\cdots 1}=\frac 19\sum\limits_{i=1}^910^{h_{x,i}}-1=\frac 19\sum\limits_{i=1}^9\sum\limits_{j=0}^{m}(10^j-1)\sum\limits_{k=1}^n[h_{k,i}=j]
                                  hx,ih_{x,i}11

因此对每个 i,ji,j 求出 k=1n[hk,i=j]\sum\limits_{k=1}^n[h_{k,i}=j] 即可求得答案。

数位 DP 即可,复杂度 O(100m2)O(100m^2)

也可以组合计数:

先让 n++,问题变成求 x<nS(x)\sum_{x < n}S(x)

定义第 ii 位是从最高位开始的第 ii 位,aia_i 表示 nn 的第 ii 位。

先枚举数 xxnn 的 LCP i[0,m)i \in [0,m),再枚举 xx 在第 i+1i+1 位上的值 j[0,ai+1)j \in [0,a_{i+1}),则所有 xx 的贡献为:

这里 kk 表示低 mi1m-i-1 位中有多少位大于等于 dd

19d=19k=0mi1(mi1k)(10d)kdmi1k(10s=1i[asd]+[jd]+k1)\frac 19\sum_{d=1}^9\sum_{k=0}^{m-i-1}\binom {m-i-1}k(10-d)^kd^{m-i-1-k}(10^{\sum_{s=1}^i[a_s \ge d]+[j \ge d]+k}-1)

故答案为:

19i=0m1j=0ai+11d=19k=0mi1(mi1k)(10d)kdmi1k(10s=1i[asd]+[jd]+k1)=19i=0m1j=0ai+11d=19((10s=1i[asd]+[jd]k=0mi1(mi1k)(10010d)kdmi1k)10mi1)=19i=0m1j=0ai+11d=19(10s=1i[asd]+[jd](1009d)mi110mi1)=19i=0m1d=19(10s=1i[asd](10max{ai+1d,0}+min{ai+1,d})(1009d)mi1ai+110mi1)=19i=1mj=19(10s=1i1[asj](1009j)mi(10max{aij,0}+min{ai,j})ai10mi)\begin{aligned} &\frac 19\sum_{i=0}^{m-1}\sum_{j=0}^{a_{i+1}-1}\sum_{d=1}^9\sum_{k=0}^{m-i-1}\binom {m-i-1}k(10-d)^kd^{m-i-1-k}(10^{\sum_{s=1}^i[a_s \ge d]+[j \ge d]+k}-1)\\ &=\frac 19\sum_{i=0}^{m-1}\sum_{j=0}^{a_{i+1}-1}\sum_{d=1}^9\left(\left(10^{\sum_{s=1}^i[a_s \ge d]+[j \ge d]}\sum_{k=0}^{m-i-1}\binom {m-i-1}k(100-10d)^kd^{m-i-1-k}\right)-10^{m-i-1}\right)\\ &=\frac 19\sum_{i=0}^{m-1}\sum_{j=0}^{a_{i+1}-1}\sum_{d=1}^9\left(10^{\sum_{s=1}^i[a_s \ge d]+[j \ge d]}(100-9d)^{m-i-1}-10^{m-i-1}\right)\\ &=\frac 19\sum_{i=0}^{m-1}\sum_{d=1}^9\left(10^{\sum_{s=1}^i[a_s \ge d]}(10\max\{a_{i+1}-d,0\}+\min\{a_{i+1},d\})(100-9d)^{m-i-1}-a_{i+1}10^{m-i-1}\right)\\ &=\frac 19\sum_{i=1}^m\sum_{j=1}^9\left(10^{\sum_{s=1}^{i-1}[a_s \ge j]}(100-9j)^{m-i}(10\max\{a_i-j,0\}+\min\{a_i,j\})-a_i10^{m-i}\right) \end{aligned}

s=1i[asd],(1009d)mi1,10mi1\sum_{s=1}^i[a_s \ge d],(100-9d)^{m-i-1},10^{m-i-1} 可以枚举 ii 时顺便维护。

复杂度 O(10m)O(10m)

CF1548D2 Gregor and the Odd Cows (Hard)

根据 Pick 定理:

S=i+b21S=i+\frac b2-1

合法三角形的条件即为 SZ2Sb(mod4)S\in \mathbb Z \land2S\equiv b \pmod 4​。

对于三角形 ABCABC​, 2S=A×B+B×C+C×A2S=|\overrightarrow A\times \overrightarrow B+\overrightarrow B\times \overrightarrow C+\overrightarrow C\times \overrightarrow A|​​​,由于 SS 是整数,所以绝对值不会影响 SS 的奇偶性,只需要各个顶点的坐标模 44 的结果就可以知道 2Smod42S \bmod 4​。

一条线段 ABAB​​​ 的 边界数 为线段上整点数减一,bb​​ 就是三条线段的边界数之和。线段 ABAB​​ 的边界数 bounds(A,B)=gcd(XAXB,YAYB)\text{bounds}(A,B)=\gcd(|X_A-X_B|,|Y_A-Y_B|)​​​​,不太好简单表示。

由于要求 SS 为整数,所以 bb 为偶数,这是一个很重要的条件,这意味着合法三角形三条边的边界数中至少有一条是偶数,另外两个奇偶性相同,判断 bounds(A,B)mod4\text{bounds}(A,B) \bmod 400 还是 22 要容易得多,

bounds(A,B)0(mod4)    XAXB(mod4)YAYB(mod4)\text{bounds}(A,B) \equiv 0\pmod 4 \iff X_A\equiv X_B\pmod 4 \land Y_A\equiv Y_B\pmod 4

bounds(A,B)≢0(mod4)\text{bounds}(A,B) \not\equiv 0\pmod 4 的前提下

bounds(A,B)2(mod4)    XAXB(mod2)YAYB(mod2)\text{bounds}(A,B) \equiv 2\pmod 4 \iff X_A\equiv X_B\pmod 2 \land Y_A\equiv Y_B\pmod 2

判断这两个条件只需要各个顶点的坐标模 44 的结果。

此时做法就清晰起来了,合法三角形按三条边的边界数奇偶性可以分成 EEE 和 EOO 两类,设 cntA,x,y,zcnt_{A,x,y,z} 表示有多少个点 BB​​ 满足

XBx(mod4)YBy(mod4)bounds(A,B)z(mod4)X_B\equiv x\pmod 4 \land Y_B\equiv y\pmod 4 \land \text{bounds}(A,B) \equiv z\pmod 4

这个是可以 O(n2logV)O(n^2\log V) 预处理的。

考虑分别对两类合法三角形 ABCABC​​​ 计数,先枚举点 AA​,再枚举

XBmod4,YBmod4,bounds(A,B)mod4XCmod4,YCmod4,bounds(A,C)mod4\begin{aligned} &X_B\bmod 4,&Y_B\bmod 4,&\text{bounds}(A,B)\bmod 4\\ &X_C\bmod 4,&Y_C\bmod 4,&\text{bounds}(A,C)\bmod 4 \end{aligned}

满足

SZbounds(A,B)bounds(A,C)(mod2)XBXC(mod2)YBYC(mod2)Sbounds(A,B)+bounds(A,C)+bounds(B,C)(mod4)\begin{aligned} S &\in \mathbb Z\\ \text{bounds}(A,B)&\equiv\text{bounds}(A,C)\pmod 2\\ X_B&\equiv X_C \pmod 2\\ Y_B&\equiv Y_C\pmod 2\\ S&\equiv \text{bounds}(A,B)+\text{bounds}(A,C)+\text{bounds}(B,C)\pmod 4 \end{aligned}

使用 cntcnt 数组可以 O(1)O(1)​​ 计算贡献。

这样每个 EEE 三角形会被算 33 遍,每个 EOO 三角形会被算 11 遍。

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

CF1548E Gregor and the Two Painters

把坏格子填成 11,其他填成 00,问题就是求矩阵中有多少个“1”的四-连通块。

引理:对于任意两行 i,ji,j​​​,“1” 所在列的集合一定是相互包含的。

不妨假设 aiaja_i \ge a_j​​,ai+bkxaj+bkxa_i+b_k \le x \Rightarrow a_j+b_k \le x​。

同时,此引理也就是这个矩阵的全部性质了,因为任何一个符合引理的矩阵都是可以构造出 a,ba,b 数组的。此题唯一的条件也就是这个引理了,目标很明确。

我们数连通块的思路是这样的:

  • 对于一个连通块 SS​​​​​​,它上到 LrL_r​​​​​​,下到 RrR_r​​​​​​,左到 LcL_c​​​​​,右到 RcR_c​​​​​​。
  • aLr,aLr+1,,aRra_{L_r},a_{L_r+1},\cdots,a_{R_r}​​​ 中第一个取到最小值的位置为 ii,显然 (i,Lc),(i,Lc+1),,(i,Rc)(i,L_c),(i,L_c+1),\cdots,(i,R_c)​ 都为 “1”。
  • 我们希望 SSii 数到。

再考虑对于 ii​,有多少个连通块会被它数到,对于第 ii 行的一个 “1” 的连续段 [l,r][l,r],它所在的连通块会被 ii​​ 数当且仅当:

  • 它向上不能走到一行 jj​​​ 满足 ajaia_j \le a_i​​​​,形式化地,mink[l,r]ak+maxk(j,i]bk>x\min_{k\in [l,r]}a_k+\max_{k\in (j,i]}b_k>x​​。
  • 它向下不能走到一行 jj​​ 满足 aj<aia_j<a_i​​​,形式化地,mink[l,r]ak+maxk[i,j)bk>x\min_{k\in [l,r]}a_k+\max_{k\in [i,j)}b_k>x​​​。

综上,记 ii 前面第一个满足 ajaia_j\le a_ijjprepreii 后面第一个满足 aj<aia_j< a_ijjsufsuf,连续段 [l,r][l,r] 造成贡献当且仅当 mini[l,r]ai>xmaxi(pre,suf)\min_{i\in [l,r]}a_i>x-\max_{i\in (pre,suf)},不等式右边对于每个 ii 是确定的,而且是可以通过单调栈 O(n)O(n)​ 预处理的东西,对于左边则可以使用数据结构来维护。

下面我们进一步讨论这个数据结构需要干什么:

  • 这个数据结构维护所有连续段 bb 的最小值。
  • 将所有行以 aia_i​ 为第一关键字,ii​​ 为第二关键字从大到小排序。每次序列中一个 00 改成 11​,会导致新增连续段,也会导致两个连续段合并,修改就是加入元素和删除元素。
  • 询问操作就是查询有多少个元素大于 keykey

对于新增连续段和合并连续段可以用并查集维护,元素则用反向树状数组维护。

复杂度 O(nlogn)O(n\log n)

CF1562E Rescue Niwen!

先分析最长上升子序列有什么性质,假设最长上升子序列为

s[l1,r1],s[l2,r2],,s[lk,rk]s[l_1,r_1],s[l_2,r_2],\cdots,s[l_k,r_k]

比较显然的是对于每个 ll,选择的 rr 是一个区间。更强的结论是存在一组最优解满足对于每个 ll,选择的 rr 是一个后缀。

反证法:假设对于一个 ll,选择的 r[r1,r2]r\in[r_1,r_2],其中 r2<nr_2<ns[l,r2]s[l,r_2] 之后的子串为 s[l,r]s[l',r']。如果 s[l,r2+1]<s[l,r]s[l,r_2+1]<s[l',r'],直接在 s[l,r2]s[l,r_2] 后插入 s[l,r2+1]s[l,r_2+1],得到一组更优的解。否则 s[l,r2]<s[l,r]s[l,r2+1]s[l,r_2]<s[l',r']\le s[l,r_2+1],说明

s[l,l+r1l]=s[l,r1]s[l,l+r1+1l]=s[l,r1+1]s[l,l+r1+2l]=s[l,r1+2]s[l,l+r2l]=s[l,r2]\begin{aligned} s[l',l'+r_1-l]&=s[l,r_1]\\ s[l',l'+r_1+1-l]&=s[l,r_1+1]\\ s[l',l'+r_1+2-l]&=s[l,r_1+2]\\ \cdots\\ s[l',l'+r_2-l]&=s[l,r_2] \end{aligned}

于是可以用前者们一一替换后者们,得到一组不存在 ll 作为左端点的子串的解。

然后就可以 DP 了,设 fif_i 表示以 s[i,n]s[i,n] 结尾的最长上升子序列,转移为

fi=maxj<is[j,n]<s[i,n]fj+nlcp(s[i,n],s[j,n])+1f_i=\max_{j<i\land s[j,n]<s[i,n]}f_j+n-\text{lcp}(s[i,n],s[j,n])+1

可以预处理 lcp(s[i,n],s[j,n])lcp(s[i+1,n],s[j+1,n])\text{lcp}(s[i,n],s[j,n])\leftarrow \text{lcp}(s[i+1,n],s[j+1,n]),复杂度 O(n2)O(n^2)

优化

可以优化到 O(nn)O(n\sqrt n)

首先是 LCP 怎么处理,通常是使用后缀数组的 height 数组,这里也可以这么处理。

求出后缀数组 SASAheight 数组,转移为

fSAi=maxj<iSAj<SAifSAj+maxk=j+1inheightk+1f_{SA_i}=\max_{j<i \land SA_j<SA_i}f_{SA_j}+\max_{k=j+1}^in-height_k+1

注意关于 height 的那项是一个后缀 max\max,考虑单调栈维护,栈内维护两元组 (v,S)(v,S),每次将 (nheighti+1+1,{i})(n-height_{i+1}+1,\{i\}) 压栈。假设栈顶元素为 (v1,S1)(v_1,S_1),下一个元素为 (v2,S2)(v_2,S_2),如果 v1v2v_1\ge v_2,就把这两个元素合并成 (v1,S1S2)(v_1,S_1\cup S_2)

在插入 ii 个元素后,就可以这样计算 fi+1f_{i+1}:遍历栈内每个三元组 (v,S)(v,S),用 maxjSSAjSAi+vfSAi+1\max_{j \in S\land SA_j\le SA_i}+v\rightarrow f_{SA_{i+1}}。但栈内元素可能很多,不能全部遍历,考虑把 Sn|S|\le \sqrt n 的栈元素的贡献用一个数据结构 AA 一起维护,每个 S>n|S|>\sqrt n 的元素用数据结构 BB 单独维护,这样就只需要遍历最多 n\sqrt nS>n|S|>\sqrt n 的栈元素,即在 AA 中查询一次前缀 max\maxBB 中查询 n\sqrt n 次前缀 max\max

元素合并的时候需要分类维护:

  • S1+S2n|S_1|+|S_2|\le \sqrt n 时,相当于把 S2S_2 的贡献整体加上一个正数,可以在 AA 中进行 S2|S_2| 次增大修改操作,这类操作总共不超过 nnn\sqrt n 次。
  • S1>nS2n|S_1|>\sqrt n\land |S_2|\le \sqrt n 时,在 BB 中进行 S2|S_2| 次插入新元素,这类操作总共不超过 nn 次。
  • S1,S2>n|S_1|,|S_2|>\sqrt nS1,S2nS1+S2>n|S_1|,|S_2|\le \sqrt n\land |S_1|+|S_2|>\sqrt n 时,用 S1+S2|S_1|+|S_2| 个元素重构一个 BB,这类操作总共不超过 n\sqrt n 次。

综上,当 AA 做到 O(1)O(1) 修改,O(n)O(\sqrt n) 查询,BB 做到 O(n)O(\sqrt n) 修改,O(1)O(1) 查询时,复杂度为 O(nn)O(n\sqrt n)

因为修改是增大值,查询是前缀 max\maxAABB 都可以通过分块实现。

CF1562F Tubular Bells

有个长度为 nn 的序列 AA,元素两两不同且值域连续,但你不知道这个序列,每次可以询问两个不同数的 lcm\text{lcm},最多使用 n+5000n+5000 次询问求出 AA

n105,Ai2×105n\le 10^5,A_i\le 2\times 10^5

如果 gcd(a,b)=1\gcd(a,b)=1,那么 lcm(a,b)=ab\text{lcm}(a,b)=ab,如果求出了 AA 序列中最大的质数 pp,就只需要 n1n-1 次询问就可以求出 AA

先考虑 pp 存在的情况,怎么求出 pp 和它的位置?询问 lcm(A1,A2),lcm(A2,A3),lcm(A3,A4),,lcm(An1,n)\text{lcm}(A_1,A_2),\text{lcm}(A_2,A_3),\text{lcm}(A_3,A_4),\cdots,\text{lcm}(A_{n-1},n),所有质因子中最大的就是 pp,同时也可以推断出 pp 的位置。然后再进行 n1n-1 次询问就求出了 AA,询问次数为 2n22n-2,可以处理 100<n7500100<n\le7500

再分别考虑 n100n\le 100n>7500n>7500 的情况。

n100n\le 100 可以先两两询问 lcm\text{lcm},再逐个确定。当 n>3n>3 时至少有两个奇数,根据两个奇数的 lcm\text{lcm} 为奇数就可以确定所有数的奇偶性,再取 lcm\text{lcm} 中最大的一个,它一定是 maxAi(maxAi1)\max A_i(\max A_i-1),结合奇偶性就可以确定最大的 AiA_i,然后删除最大值,重复上述过程,直到 n=3n=3 时,分类讨论即可。

n>7500n>7500 时需要用不超过 50005000 次询问求出 AA 序列中最大的质数 pp,然而比较困难,考虑不找最大的质数,找一个大于 450450 的质数 pp' 就行了。

考虑随机询问 lcm(Ai,Aj)\text{lcm}(A_i,A_j),如果它是两个大于 450450 的质数 p,qp,q 的乘积,那么 Ai,AjA_i,A_j 一定就是 p,qp,q,考虑进一步确定 AiA_i,随机一个 kk,如果 p∤lcm(Ai,Ak)p\not|\text{lcm}(A_i,A_k) 说明 Ai=pA_i=p,如果 q∤lcm(Aj,Ak)q\not|\text{lcm}(A_j,A_k) 说明 Ai=qA_i=q,期望的总随机次数是 O(ln2n)O(\ln^2n)

考虑

lcm(p,x)={x(xp)xp(x∤p)\text{lcm}(p',x)= \begin{cases} x&(x|p')\\ xp'&(x\not|p') \end{cases}

如果 lcm(p,x)>2×105\text{lcm}(p',x)>2\times 10^5 就说明 x∤px\not|p',可以确定 xx 的值,这样至少可以确定 n900n-900 个数,并且最大的质数 pp 一定被确定了,最后再用 pp 和剩下的数询问即可。

CF566C Logistical Questions

给定一棵 nn 个点的带权树,每个点住了 wiw_i 个人,一个人从 uuvv 的花费为距离的 1.51.5 次方。

定义 f(u)f(u) 表示所有人到点 uu 的总花费,求 f(u)f(u) 最小的点。

n2×105n \le 2\times 10^5

首先研究 f(u)f(u) 有什么性质,假设花费等于距离的话 f(u)f(u) 就是单峰的,因此猜想 f(u)f(u) 是单蜂的。

证明:由于 wvdisv1.5(u)w_v\text{dis}^{1.5}_v(u) 是下凸函数,所以它们加起来也是下凸函数。

回忆实数上的单蜂函数是怎么求最值的:当前确定最优点在 [l,r][l,r] 中,在 l+r2\frac {l+r}2 处求导来确定最远点在 l+r2\frac {l+r}2 左边还是右边,然后将范围减半。

考虑怎么在树上实现这个过程:求出整棵树的重心,通过确定最优解在重心的哪个子树来将范围减半。

怎么确定最优解在哪棵子树?把 f(u)f(u) 的定义域扩大,uu 可以是一条边上的位置。求出重心向各个方向的导数,由于 f(u)f(u) 单峰,所以最多有一个导数小于 00,这是最优解的方向。假设最优解的方向沿着边 (u,v)(u,v),由于 f(u)f(u) 的最优点可能在 (u,v)(u,v) 上,所以 vv 不一定比 uu 优,应该把经过的所有点取个最小值作为答案。

uu 向儿子 vv 方向的导数为:

32(i=1nwidis(i,u)2isubree(v)widis(i,u))\frac 32\left(\sum_{i=1}^nw_i\sqrt{\text{dis}(i,u)}-2\sum_{i\in \text{subree}(v)}w_i\sqrt{\text{dis}(i,u)}\right)

可以 O(n)O(n) 求出 uu 向每个儿子的导数,复杂度 O(nlogn)O(n\log n)

CF1149C Tree Generator

给定一个长度为 2(n1)2(n-1) 的合法括号序列,还有 qq 次交换操作(保证交换后合法)。

求每次交换后括号序列建出来的树的直径。

n,q105n,q \le 10^5

容易想到直接维护树的形态,但发现很困难。

考虑括号序列的本质是什么,把 ( 变成 11) 变成 1-1,再做一遍前缀和,就是树的欧拉序的深度序列,记这个序列为 depdep

然后问题变得清晰起来了,因为树上两点间的距离只和 depdep 有关。假设欧拉序上第 aa 个结点为 uu,第 bb 个结点 vv,满足 aba \le b,那么

dis(u,v)=depa+depb2mini=abdepi\text{dis}(u,v)=dep_a+dep_b-2\min_{i=a}^bdep_i

于是直径为

maxijkdepi+depk2depj\max_{i\le j\le k}dep_i+dep_k-2dep_j

用线段树维护即可,复杂度 O(nlogn)O(n\log n)

0%