Atcoder 题目选做(一)


By DaiRuiChen007


1. [ARC080F] Prime Flip

Problem Link

数轴上有 n 个点 a1an 的颜色是黑色的,其余颜色为白色。

每次操作可以选连续 p 个位置反色,其中 p 必须是奇素数。

求全部位置染白的最小操作次数。

数据范围:n100,ai107

考虑差分,变成 di,di+p 取反,然后观察某两个为 1 的位置:i,j,考虑这两个数还原的代价:

  • |ij| 为奇素数,则 1 次操作即可还原这两个数。
  • |ij| 为偶数,则 2 次操作可以还原:|ij|6 时根据哥德巴赫猜想拆成两个奇素数之和,否则拆成 53/73
  • |ij| 为奇合数,则 3 次操作可以还原,因为你要把 |ij| 表示成若干个奇素数的和或差,那么操作次数必定与 |ij| 同奇偶,构造很 trivial。

可以证明答案一定是把这些 i,j 两两匹配。

先考虑只有后两种,那么同奇偶的点内部优先匹配,至多一组 (i,j) 会用第三种方式还原。

然后考虑第一种操作,显然这种操作的点越多越好,注意到 imod2jmod2,因此连边后求二分图最大匹配即可。

时间复杂度 O(n2n+n2π(V))

Submission Link




2. [ABC251Ex] Fill Triangle

Problem Link

给定 an,1an,n,以 m 个值相同的区间的形式表示。

定义 ai,j=ai+1,j+ai+1,j+1,求 ak,1ak,kmod7

数据范围:n109,m200,k5×105

先考虑 an,jak,i 的贡献系数,那就是 (nkji)

因此对于一个区间相等 an,lan,r,对单个 ak,i 的贡献系数就是 (nkli)++(nkri)

因此我们只要求组合数前缀和 mod7 之后的结果。

可以用 Lucas 定理维护,设 i=0y(nx)=F(x,y),特殊处理最后 ymodn 项得到:

F(x,y)=F(xmodp,p1)×F(x/p,y/p1)+(x/py/p)×F(xmodp,ymodp)

预处理 0x,y<p 的结果,能够做到 O(log7n),为了优化常数,我们可以先求出 F(x,y)mod74 的结果,由于 109<712,那么这样只要递归 3 层即可,可以近似看成 O(1) 的。

时间复杂度 O(mk)

Submission Link




3. [ARC087E] Prefix-free Game

Problem Link

定义一个 01 串集合 S 是好的:

  • 所有元素长度在 [1,m] 之间。
  • 对于所有 sSs 的所有前缀不属于 S

给定初始值 S=S0,Alice 和 Bob 轮流往 S 中插入一个字符串,谁不能保持 S 是好的就输了,求赢家。

数据范围:L=sS|s|105,m1018

先建立 Trie 树,那么 Trie 上的点和所有叶子的子树不能选。

那么剩下来的就是一些一度点的空子树,显然这些子树之间的博弈是互不影响的,求出每个子树的 SG 值后异或起来即可。

我们只要求 sgn 表示深度为 n 的空 Trie 上的博弈的 SG 函数,枚举插入字符串深度得到:

sgn=mex{k=nin1sgk1in}

打表发现 sgn=lowbit(n),可以归纳法证明,直接求值即可。

时间复杂度 O(L)

Submission Link




4. [AGC006F] Blackout

Problem Link

给定 n×n 网格,其中 m 个位置是黑色,按如下方式操作若干次:

  • (a,b),(b,c) 是黑色,则令 (c,a) 为黑色。

求最多的黑色网格数量。

数据范围:n,m105

考虑把每个黑格子看成 ab 的边,然后玩一玩环的情况,容易发现有自环 uuu 对应的弱连通块最终一定会变成完全图。

继续观察:对于一个大小为 len 的环,选两对邻边操作,可以构造出一个大小为 len2 的环,已知 len{1,2} 必能生成完全图。那么容易推知:对于任意 3len,大小为 len 的环所在的弱连通块最后一定会变成完全图。

接下来考虑 3len 的情况,对于同一个弱连通块容易想到三染色,把所有点染成 0/1/2 三种颜色,可以猜测最后的图中异色之间全部有边,同色之间全部没有额外边,可以通过归纳法考虑向某个颜色中加入一个新点证明。

注意特判整张图只能二染色的情况,对于每个连通块分别处理即可,注意每次要处理完整个弱连通块,因此考虑加入反向边。

时间复杂度 O(n+m)

Submission Link




5. [ABC252Ex] K-th beautiful Necklace

Problem Link

给定 n 个球 m 种颜色,每个球有权值 v,对于一种方案,选出每种颜色的球各一个,权值为选出球的权值异或和,求第 k 大的权值。

数据范围:n,m70,k1018,v260

此时最大的方案数 K=322×41.2×1011

因此可以考虑 Meet-in-Middle,把所有颜色分成 L,R 两个集合,使得每个集合总方案数接近 K,可以证明误差不会太大。

那么我们可以爆搜得到每个颜色集合对应的权值集合。

然后把 L 中的数插入 01-Trie,统一维护 R 中每个数当前匹配到的位置,从高到低试填求出当前这一位为 1 时每个数匹配到的子树的大小之和,和 k 比较即可。

时间复杂度 O(KlogV)

Submission Link




*6. [ARC139F] Many Xor Optimization Problems

Problem Link

给定一个长度为 n,值域为 [0,2m) 的序列,求所有子集的最大子集异或和的和。

数据范围:n,m2×105

在介绍该问题做法前,我们先介绍一下二项式系数的拓展形式,q-binomial。

具体来说,q-binomial 依如下形式定义:

(n)q=i=0n1qi=qn1q1(nm)q=i=1n(i)qi=1m(i)qi=1nm(i)q

容易发现 q=1 就是正常的二项式系数,类比二项式系数的递推形式,q-binomial 也有如下的递推式:

(nm)q=qm(n1m)q+(n1m1)q=qnm(n1m1)q+(n1m)q

证明方法是数学归纳法,然后展开观察系数。

这也为我们理解 q-binomial 的组合意义提供了一种方式:对于所有 (0,0)(nm,m) 的格路,求 q 的和。

根据组合意义,我们可以证明如下恒等式:

i=mnqim(im)q=(n+1m+1)q

除去暴力展开,该结论可以通过组合意义理解,先通过对称让 q-binomial 求所有格路 q 的左上方点数。

然后枚举 (im,m)(im,m+1) 的时刻,而此时 m+1 行左上方的点数就是 qim,因此原结论得证。

然后回到原题上来,我们分步枚举,先枚举线性基大小 k,以及自由元 a1aka1a2ak)。

那么把原问题分三部分考虑,先求最大异或和的期望,显然自由元必须在其中,其他位在或不在概率均等。

因此这部分答案是 12(2ak+11+i=1k2ai)

然后考虑 k 个自由元的填法,对矩阵进行转置,变成求 n2k 向量线性无关:答案显然为 i=0m1(2n2i)

对于剩余的数码,把每个向量写成高斯消元后的标准型,这个过程是一个双射。

容易发现只有 k 个向量非零,第 i 个向量剩余位任选的方案数为 2ai(i1)

因此我们得到:

Answer=k=1,a1akmin(n,m)i=0k1(2n2i)12(2ak+11+i=0k2ai)i=1k2ai(i1)=12k=1,a1akmin(n,m)2k(k1)/2i=0k1(2n2i)(2ak+11+i=0k2ai)i=1k2ai

把三个式子拆开分类讨论。

先计算第一部分 i=1k2ai

考虑格路计数的模型,对于 0m1 的每一位,是自由元看成向右走一步,非自由元看成向上走一步,那么我们能得到 i=1k2ai(i1) 的和,又因为该模型可以用 q-binomial 描述,因此得到:

a1aki=1k2ai=2k(k1)/2(mk)2

然后计算第二部分 (i=1k2ai)i=1k2ai

考虑容斥,先把求和号里的式子当成 2m1,然后容斥掉选的那一位不属于 a1ak 的贡献。

那么第二部分可以看成选 k+1 个元素的 2ai 之积,容易发现这个和式能用 (mk+1)2 表出。

但注意,对于 k+1 个元素,选出 k 个自由元的方案数为 k+1 种,因此得到:

a1ak(i=1k2ai)i=1k2ai=(2m1)2k(k1)/2(mk)2(k+1)2k(k+1)/2(mk+1)2

最后计算第三部分 2ak+1i=1k2ai

枚举 ak=i,那么剩下的问题是一个 (ik1)2 的子问题,配凑系数用刚才提到的 q-binomial 上指标求和公式处理:

a1ak2ak+1i=1k2ai=2(k1)(k2)/2+1i=0m122i(ik1)2=2(k1)(k2)/2+1×2k2(i=0m1(2i+11)2ik+1(ik1)2+i=0m12ik+1(ik1)2)=2k(k1)/2((2k1)i=0m12ik+1(i+1k)2+(mk)2)=2k(k1)/2((2k1)(m+1k+1)2+(mk)2)=2k(k1)/2((2k1)(2mk(mk)2+(mk+1)2)+(mk)2)=2k(k1)/2((2m2mk+1)(mk)2+(2k1)(mk+1)2)

最后把三个式子全部带入得到:

Answer=12k=1,a1akmin(n,m)2k(k1)/2i=0k1(2n2i)(2ak+11+i=0k2ai)i=1k2ai=12k=1,a1akmin(n,m)2k(k1)/2i=0k1(2n2i)2k(k1)/2((2m+12mk1)(mk)2(k2k+2k1)(mk+1)2)=12k=1,a1akmin(n,m)i=0k1(2n2i)((2m+12mk1)(mk)2(k2k+2k1)(mk+1)2)

最终按照式子计算即可。

时间复杂度 O(n+m)

Submission Link




7. [ABC255G] Constrained Nim

Problem Link

给定 n 堆石子的 Nim 游戏,有 m 个限制表示:当前堆大小为 x 时不能取 y 个石子,求最终谁必胜。

数据范围:n,m2×105

考虑算 SG 函数,我们需要特殊处理 O(m) 个有特殊限制的点的 SG(x)

首先如果一个 x 没有限制,那么他的 SG 函数值就是 1+maxixSG(i),因此 SG 函数可以看成若干段斜率为 1 的一次函数,在所有有特殊限制的点处取值突变,因此对于突变点 x ,由 SG(x+1) 的值即可确定该段函数。

因此用 map 存每个突变点 xx+1 的 SG 函数值,二分即可得到任意 x 的 SG 函数值。

然后考虑突变点,我们要在 SG(1)SG(x1) 中找到所有 SG(xy) 并删掉,统计每种删掉的函数值的出现个数,我们只要求某个 SG 函数值 w 的出现总次数。

观察一下函数图像可以发现,对于所有非突变点,他们的 SG 函数值单调递增(这是显然的),且中间不存在断点。

因此 w 一定在非突变点中出现恰好一次,而在突变点中的出现次数可以用 map 维护。

时间复杂度 O(mlogm)

Submission Link




8. [ARC140F] ABS Permutation Count

Problem Link

给定 n,m,对于所有 k=0n1 求恰有 ki 满足 |pi+1pi|=m 的排列数量。

数据范围:n2.5×105

先考虑 q=p1,那么我们要求的就是恰有 ki 满足 |qi+mqi|=1

先考虑 m=1 的情况,此时这个问题是经典的二项式反演,设 gk 表示钦定 ki 满足条件的方案数,那么答案 fk=ikfi(1)ik(ik),一次卷积即可。

gk 又能看成原序列被分成 nk 个值域连续 +1/1 的段,对于长度 >1 的段有两种排列方式,最后再乘 (nk)! 排列值域相对顺序,用生成函数表示得到:

gk=(nk)![zn](z+2z2+2z3+)nk=(nk)![zk](2x1zz)nk=(nk)![zk](21z1)nk=(nk)!i=0nk(1)nki2i(nki)[zk]1(1z)i=(nk)!i=0nk(1)nki2i(nki)(k+i1i1)

进行一次卷积即可,注意 g0 要特殊处理。

对于一般的情况,递归处理 n=n/m 的生成函数为 g1n=n/m+1 的生成函数为 g2

那么最终的生成函数为 g1mnmodm×g2nmodm,多项式快速幂计算,注意 (nk)! 要在最后乘,最后一次二项式反演即可。

时间复杂度 O(nlogn)

Submission Link




9. [ARC141D] Non-divisible Set

Problem Link

给定 n 个数的集合,值域 [1,2m],对于每个 ai 求出是否存在一个大小为 m 的子集包含 ai 且任意两个数不为倍数关系。

数据范围:m3×105

注意到值域很小,因此考虑每个数的奇数部分,即把每个数拆成 k×2d 其中 k 为奇数。

对于同一个 k,显然至多选一个元素,又因为不同的 k 只有 m 个,因此每个 k 恰好贡献一个数。

对于 pk,那么 p×2ck×2d 同时选必须有 c>d,那么对于每个 k,其因数全部选尽可能大的 2c,倍数全部选尽可能小的 2c

具体的构造直接让因数从小到到大贪心取,倍数从大到小贪心取即可。

因此对于每个 k,合法的 d 是一个区间,且该区间可以快速求出,即 lkmaxkp{lp+1},rkmaxpk{rp1},找到区间内第一个和最后一个存在的 d 即可。

时间复杂度 O(mlogm)

Submission Link




10. [ARC141E] Sliding Edge on Torus

Problem Link

给定 n×n 个点,标号 (1,1)(n,n)q 次操作对于所有 ((a+k)modn,(b+k)modn)((c+k)modn,(d+k)modn) 连边(0k<n)。

每次操作后求图中连通块数。

数据范围:n,q2×105

首先把 (x,y)(x,(yx)modn) 表示,那么相当于 (i,(ba)modn)((ia+c)modn,(dc)modn) 连边。

对于 (ba)modn(dc)modn,如果他们原先不在一个连通块里,那么连边相当于建立点之间的映射,如果此前他们已经联通,那么我们可以看成在 (ba)modn 内部的连边,而边长(每条边跨越的长度)可以算出,那么每次连边后新的环数也可以维护(即所有边长的 gcd)。

因此用带权并查集维护当前列中的点到连通块的根中的点的映射,以及每个连通块内所有边长的 gcd 即可,合并是简单的。

时间复杂度 O(qα(n))

Submission Link




*11. [ARC141F] Well-defined Abbreviation

Problem Link

给定字符串集合 S1Sn,对于一个字符串 T,每次可以删去 T 中的一个 Si 子串直到不能操作,判定是否存在一个 T 使得最终停止时的 T 不唯一。

数据范围:L=|Si|2×106

考虑什么时候 T 会产生两种不同的结果,手玩可以发现,当 T 包含子串 A+B+CA+B,B+CS 时就会导致 T 产生的结果不唯一。

当然前提条件是 A,C 不能同时被消成相等的。

进一步观察这个条件,我们发现需要对于 SjSi 的情况进行处理,但由于本题较强的约束条件,此时的 Si 无论以任何方式操作,都必须在空串处停止,否则 T=Si 即是一组解。

因此我们可以考虑贪心,对 S1Sn 建 AC 自动机,逐位加入 Si 的字符,如果当前串与某个 Sj 匹配,那么贪心地删去 Sj,显然每次都会删掉一个后缀,因此用栈维护当前串每一位在 AC 自动机上的位置即可。

这个过程结束后得到的串如果非空那么原题有解,否则保留 Si 当且仅当不存在其他 Sj 被当前串包含。注意特判存在 SjSi 后缀的情况。

此时任意两个字符串没有包含关系,然后我们只需判定有无这样的 A,B,C 即可。

然后对剩余的串建 AC 自动机,枚举 A+B,跳 Fail 树得到所有可能的 B,用哈希判断此时的 C 是否与 A 相等即可。

时间复杂度 O(L|Σ|)

Submission Link




12. [ARC142D] Deterministic Placing

Problem Link

给定 n 个点的树,在树上放若干棋子:定义一次操作会把每个棋子移动到他的一个邻居上,使得每条边至多被经过一次,移动后每个点上至多一个棋子。

求有多少种初始放棋子的方法,使得可以该局面可以被操作任意次,且每次操作方案都唯一。

数据范围:n2×105

手玩棋子移动的过程,先考虑树是链的情况,此时只有一个端点上没有棋子,然后其他棋子在这条链上往返运动。

然后考虑一般树的情况,容易发现一个合法局面依然能被分解成若干条链,并且链需要是有向的,设其指向空端点。

进一步的,对于一种合法的有向链剖分,链尾不能相邻,否则可以合成一条两端都是空节点的链,链头不能相邻,否则一次操作后就变成上面的情况,且链头或链尾不能和链中间节点相邻,否则中段节点可以跟另一条链尾。

那么可以设计 dp:fu,07 表示当前节点是链头,且有 / 没有链尾,当前节点是链尾,且有 / 没有链头,当前节点是链中间节点,且有 / 没有链头,有 / 没有链尾,转移时简单分类讨论即可。

时间复杂度 O(n)

Submission Link




*13. [ARC142E] Pairing Wizards

Problem Link

题目大意

给定 a1an,b1bnm 组限制 (x,y),确定 c1cn 使得 cxbx,cybycxby,cybx,最小化 |ciai|

数据范围:n,V100

思路分析

显然 ci>ai,考虑网络流建模,用切糕模型处理:连接 (i,j)T 权值为 1(i,j)(i,j1) 权值为 ,表示 ciai+j

但是题目中的限制不好处理,设 bxby,我们先初步调整令 ax,ayby,然后去除所有 max(ax,ay)bx 的限制。

此时 ax,ay<bx,那么对于此时的 x,要么 cxbx,要么所有的 cybx,我们可以这样建模:连接 Sx 权值为 bxax,连接 x(y,bxay) 权值为

但这个模型有一点不完备:对于一个 x,我们可能可能在 Sx(x,i)(x,i1) 的链上分别割掉了一些边,此时这些代价就会被重复计算。

但我们发现这是不可能的,首先 Sx 说明 ax<bx,其次存在某条 z(x,i) 说明 bzbx 且我们呢已经调整使得 az,axbx 从而导出矛盾。

因此这样的网络上的最小割就是答案。

时间复杂度 O(MaxFlow(nV,nV+m))

Submission Link




14. [ARC142F] Paired Wizards

Problem Link

有两个变量 x,y 以及 S=0,他们可以分别执行两种操作之一:

  • 操作一:xx+1yy+1
  • 操作二:SS+xSS+y

接下来有 n 秒,每秒给定 a,b,c,d{1,2},你要在如下两种策略中选一项执行:

  • x 执行操作 ay 执行操作 b
  • x 执行操作 cy 执行操作 d

求最终 S 的最大值。

数据范围:n8000

先转化代价计算:我们只考虑一个人所有操作二的时刻 t1tm,设 ti 递增,那么总贡献就是 tii

设所有 ti 的和为 wx 操作数 mxy 操作数 my,那么贡献就是 wmx(mx+1)2my(my+1)2,因此我们只关心 w,mx,my

考虑对所有操作分类讨论:

  • (a,b)=(c,d):这种操作没有选择空间,直接统计入 w,mx,my
  • a=c,bd:这种 x 没有选择空间,先计入 w,mx,然后枚举选择二操作的次数,即对 my 的贡献确定,此时我们只要最大化 w,即选择时间最靠后一段操作。
  • ac,b=d:类似上面,先统计 w,my,然后枚举 mx,选择操作的一段后缀。
  • (a,b),(c,d)=(1,1),(2,2):此时同上,枚举选择 (2,2) 的操作次数,同上,此时依然会选择一段后缀操作。
  • (a,b),(c,d)=(1,2),(2,1):此时对 w 的贡献一定,我们只要枚举几个 mx 几个 my 即可。

此时暴力枚举四类操作,复杂度 O(n4)

考虑分离过程:例如 a=c,bd 的操作,他们的最优决策只和其他操作中 my 的贡献有关,因此我们可以设 fi 表示 my=i 的最优代价,同理 ac,b=d 的操作设 gi 表示外界 mx=i 的最小代价。

然后我们枚举最后两类操作的选择次数,那么我们可以直接得到外界 mx,my 的数量,查询 fmx+gmy 即可得到此时第二、三类操作的最优贡献之和。

时间复杂度 O(n2)

由于代价函数满足四边形不等式,可以用分治或其他手段优化求值过程,或许可以做到 O(nlogn)

Submission Link




15. AND OR Equation

Problem Link

题目大意

给定 n,k,求有多少序列 a0a2n1 满足值域 [1,k] 且对于所有 i,j 都有:ai+aj=aiANDj+aiORj

数据范围:n3×105,k1018

思路分析

考虑逐位构造,考虑从 a0a2d1 推出 a0a2d+11

对于 i,j<2d,我们知道 ai+aj+d=aiANDj+a(iORj)+d=ai+d+aj

因此 ai+daj+d=aiaj,即 a2da2d+11a0a2d1 是“相似”的,即差分相同。

那么可以考虑 dp,fd,x 表示当前序列长度 2d,序列极差为 x,考虑每次转移时值域的扩张量:fd+1,x+ifd,x+(1+[i>0])

我们要从 f0,0=1 出发,求出 fn,i(ki+1),枚举 j 表示转移过程中恰好有 j 个时刻增加量 >0,得到:

Answer=i=0k(ki+1)j=0min(n,i)(nj)2j(i1j1)

根据组合恒等式能得到答案为 j=0n2j(nj)(k+1j+1),维护 (k+1)j+1 即可。

时间复杂度 O(n)

Submission Link




16. [ARC144E] GCD of Path Weights

Problem Link

给定 n 个点 m 条边的 DAG,点有点权,有一些点权不确定,找到一种方式最大化所有 1n 路径点权和的 gcd

数据范围:n3×105

先删除所有不在 1n 路径上的点,然后拆点成边,使得答案变成路径边权和。

设答案为 p,根据经典结论,存在一组序列 d1dn 使得 (u,v)E,du+w(u,v)dv(modp)

把图看成无向图,只要处理所有环的 gcd 即可。

用可持久化并查集维护 drtdu 的值,遇到环时把答案和 du+w(u,v)dvgcd 即可。

时间复杂度 O((n+m)α(n))

Submission Link




*17. [AGC008F] Black Radius

Problem Link

给定一棵 n 个点的数,f(u,d) 定义为距离 u 不超过 d 的点构成的集合,给定一个集合 SV,求对于所有 uS 共有多少本质不同的 f(u,d)

数据范围:n2×105

首先考虑 S=V 的情况,容易发现 f(u,d) 容易产生重复,因此考虑最小表示法计数,对于每个 Vf(u,d),一定有一个 u 能最小化 d,那么我们在这个 u 处记录 d 即可。

u 为根考虑,首先 f(u,d)<V,因此 d<fiu,其中 fiu 表示 u 所有儿子中的最大深度,然后考虑最小化 d 的限制,如果存在一个 u 的儿子 v 满足 f(v,d1)=f(u,d) 则此时 d 不合法。

此时删掉 v 子树,不存在和 u 距离 d1/d 的点,考虑取删除 fiu 对应子树,显然找次大深度子树,记为 seu,那么 d1seu,可以证明 d<min(fiu,seu+2) 是充分的。

然后考虑 SV 的情况,对于一个 uS,依然考虑以 u 为最小表示的点集,且这个点集能被另一个 S 中的点 v 表示,显然要求 v 对应的子树全部属于 f(u,d),求出这些 v 对应子树里深度最小的一个,记为 louu 的贡献就是 min(fiu,seu+2)lou

换根 dp 维护即可,记得最后加上全集。

时间复杂度 O(n)

Submission Link




*18. [ABC257Ex] Dice Sum 2

Problem Link

给定 n 个骰子,第 i 个骰子代价为 wi,以均等概率得到 ai,1ai,6,你可以购买 m 个骰子,获得的权值是这些骰子显示面的数字之和的平方,求最大期望收益。

数据范围:n1000

先考虑如何刻画选择 n 个骰子后的期望收益,可以建立 PGF,Fi(z)=16x=16zai,x,那么整体的 PGF F(z)=i=1nFi(z)

根据经典结论,平方的期望相当于 i2[zi]F(z),即 (zF(z))z=1 处的值。

展开得到:

(zF(z))=zF(z)+F(z)=z(ijFi(z)Fj(z)ki,kjFk(z)+i=1nFi(z)jiFj(z))+i=1nFi(z)jiFj(z)

Fi(1)=1Fi(1)=ai,x,记为 CiFi(1)=ai,x2,记为 Di,带入得到答案为:

ijCi+iDi2+Ci=(Ci)2+(Di2+CiCi2)

xi=Ci,yi=Di2+CiCi2wi,那么问题就转化为选择若干 k1km 最小化 (xi)2+yi

枚举 k=xi,此时我们把所有数按 kxi+yi 排序从大到小取 m 个即可。

进一步,我们不需要使得 xi=k,只要对于每个 k 都算出一种最优解即可。

即对于所有大小为 m 的子集,我们只考虑那些存在某个 k 使得子集中的元素的 kxi+yi 排序后恰好是全体元素中前 m 大的那些子集。

此时枚举量为 O(V),进一步优化,我们只要考虑哪些 k 会使得 kxi+yikxj+yj 的大小关系发生改变。

因此令 k 从小到大取遍所有 yiyjxjxi,动态维护前 m 个值的和即可。

时间复杂度:O(n2logn)

Submission Link




19. [AGC017E] Jigsaw

Problem Link

给定 n 个积木,每个积木中间高为 h,左右两边离地 ci,di,积木块高度为 ai,bi,求能否把这些积木拼在一起使得没有积木块悬空。

数据范围:n105,h200

考虑对每个积木设定特征值,其左特征值在 ci=0 时设为 ai,否则是 ci,右边同理。记该积木特征值为 (li,ri)

容易发现 i,j 能拼在一起当且仅当 ri+lj=0,考虑对所有 li 取反,这样 ri=lj 才能拼在一起,把每个点看成一个 liri 的边,容易发现原问题等价于把所有边分解成链。

需要注意一个特殊情况就是 i,j 相邻,且 di=0,cj=0,此时相当于是两条链,因此我们只要找一种把所有边分解成任意多的链的方案,观察发现每个链必须从负权点出发到正权点,因此若记 deg(u)=indeg(u)outdeg(u),则每个负权点必须满足 deg(u)0,正权点必须满足 deg(u)0

对于同一弱联通块中的点,满足 deg(u)<0,deg(u)>0 的点至少各一个,可以证明以上两个条件是充分的,证明如下:

考虑选一个 u,满足 deg(u)<0,考虑一条边 (u,v),若 deg(v)0,显然 outdeg(v)1,找到出边继续访问,直到找到一个 deg(v)>0 的点结束。

考虑 uv 的路径,其中除 u,v 的点 deg 都为 0,删掉这条路径,显然会形成若干个连通块,且每个连通块至少有一个节点 wuv 上,若这个连通块没有 deg(u)0 的点,则可以把这个连通块里的所有边连成一个 ww 的欧拉回路并到 uv 的路径上,否则数学归纳法可证这个连通块可以独立分解。

证毕。

注意特判没有出边入边的点,对每个弱联通块分别处理即可。

时间复杂度 O(n+h)

Submission Link




*20. [ARC145E] Adjacent XOR

Problem Link

给定 a1an,每次操作可以选定一个 k,对于所有 i[2,k] 同时操作 aiai1ai

7×104 次操作内将 a1an 变成 b1bn

数据范围:n1000,V260

反转操作过程,变成每次对 b1bi 做异或前缀和。

那么合法的一个必要条件就是 aibi 可以由 b1bi1 异或表出。

由于 (i,n][1,i] 独立,因此我们可以逆序还原 bnb1

对于单个 bi,我们可以把 aib1bi 表出,求出线性基 c1ck,我们需要若干次操作调整使得 b1bi 中每种基底的出现次数和在 ai 中相等,最后一次操作 i

ci=bpi,那么 b1bpi1 的表示中没有 ci,因此如果出现次数不等,我们操作 pi+1 即可反转 ci 出现次数。

根据上面的假设,aibi 可以由 b1bi1 表出,因此贪心建立线性基,假设 bi 是一组基底,即 bi 不能被 b1bi1 表出,此时 ai 不可能由 bibi1 表出,否则可以通过表示 ai,aibi 得到 bi,产生矛盾。

因此顺序插入时,若 bib1bi 中的一个基底,ai 的表示方式中一定包含 bi,因此我们的调整操作不可能操作到 i+1 位上,从而证明了该判定是充分的。

逆序依次操作,每次建立线性基求解即可,操作次数 nlogV

时间复杂度 O(n2logV)

Submission Link

posted @   DaiRuiChen007  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示