Atcoder 题目选做(三)


By DaiRuiChen007




1. [ARC152E] Xor Annihilation

Problem Link

2n1 个动点,权值为 12n1 的排列,对于每个点,设其左右两边所有点权异或和分别为 L,R,那么他会向较大 L/R 较大的一边移动,如果 L=R 则静止不动。

所有点运动速度一定,如果两个点相遇那么他们会合成一个新点,权值为他们的异或和。

在左右无穷点处放两个权值为 x 的静点(x[0,2n))求有多少 x 使得最终所有点都静止。

数据范围:n18

注意到权值异或总和为 0,因此设前缀异或和为 si,那么 i 左边和右边的点权异或和就是 si1si

那么如果两个点 i,i+1 合成之后相当于删掉 si,这要求 sisi1sisi+1 且三个数不全相等。

那么整个排列会不断操作直到所有 s 相等或呈单谷。

如果 s 单谷那么说明谷低左侧的点向左无限运动,必然不合法。

因此我们要使得最终所有 s 相等,显然这个相等的值就是 mini=1nsi,那么这些点能静止当且仅当 sminx

因此我们要计数有多少 x 使得所有 sixx,这只要 si 最高位不属于 x 即可。

求出所有 si 最高位的并,剩下的位可以随便选。

时间复杂度 O(2n)

Submission Link




2. [ARC152F] Attraction on Tree

Problem Link

给定一个 n 个点的树,一个动点 x 初始在 1,找到一个排列 p1pn,使得第 i 步满足 xpi 然后让 xpi 方向移动一条边,最终 x=n,最小化过程中 x 经过的点数。

数据范围:n2×105

显然最终经过了 2k+dis(1,n) 条边,因此 ndis(1,n)(mod2) 就不合法。

先考虑最小值,即只经过 path(1,n) 的方案。

那么对于路径上第 i 个点 ci,设他在路径外的子树大小为 siz(ci)

我们发现很多操作都要在折返中抵消,那么我们只要钦定链上哪些操作最终有用,剩下的操作形成若干跨子树的匹配,那么我们一定能构造一个合法的 p

根据经典结论,那么我们要求剩下的操作中不存在绝对众数。

找到最大的 siz(ci),那么我们至多在他的子树里钦定 i 个没被抵消。

因此这种情况的充要条件就是 siz(ci)indis(1,n)2,显然这样的 i 至多一个,因此我们能构造出一个合法的匹配。

否则找到不合法的这棵子树,枚举一个连通块 S,记每个连通块内节点 u 在连通块外的子树大小为 siz(u)

那么我们依然要求 siz(u)indis(1,n)2,证明大致同上。

那么我们要在这个基础上保留尽可能少的节点是的所有 siz(u) 不超过 k=ndis(1,n)2+i

注意到 siz(ci)ndis(1,n)2k,因此不合法的所有点构成一条链,对于每个点贪心地割掉若干个最大的子树即可。

时间复杂度 O(n)

Submission Link




3. [ABC273G] Row Column Sums 2

Problem Link

求有多少个 n×n 正整数矩阵使得其第 i 行和是 ri,第 j 列和是 cj

数据范围:n5000,ri,cj2

显然 ricj 无解,不妨记 m=ri=cj

否则我们可以看成二分图,ri=0 不建点,ri=2 拆成两个点,右部 cj 同理,两个点 (i,j) 匹配表示 Ai,j+1

但是对于 ri=2,cj=1,ck=1 此时 i0j,i1ki0k,i1j 是同一种方案,因此假设 ri,cj 中分别有 x,y2,那么答案要除以 2x+y

但这并不完全对,假如 ri=2,cj=2,且 (i0,i1)(j0,j1),此时只是重复计算了两倍贡献但除以了 4,因此对于这样的匹配要乘回一个 2

因此我们枚举 i 表示有多少这样的 rp=cq=2 且互相匹配,对答案的贡献就是对应匹配数 ×2i,那么我们要求剩余部分没有这样的匹配,可以容斥原理解决:

Ans=12x+yi=0min(x,y)2i(xi)(yi)i!2ij=0min(x,y)i(xij)(yij)j!2j(m2i2j)!

其中乘第二个 2i 是这 i(p0,p1),(q0,q1) 中每对有两种匹配方式。

时间复杂度 O(n2)

Submission Link




4. [ABC273Ex] Inv(0,1)ving Insert(1,0)n

Problem Link

给定 n 个分数 aibi,记 fl,r 表示 alblarbr 在 Stern-Brocot Tree 上的虚树大小,求 1lrnfl,r

数据范围:n105,ai,bi109

先考虑如何求 l=r 的情况,显然一个分数的深度可以很大,但是根据经典结论,这条路径上转向点至多 O(logV) 个。

因此对于当前树上区间 (aLbL,aRbR),我们可以求出最大的 k 使得 aibi<kaL+aRkbL+bRaibi>aL+kaRbL+kbR,这是容易的。

那么对于这个问题,首先如果 gcd(ai,bi)1,那么该分数无法表示,因此 fl,r>0 的区间不会包含这些点,那么我们可以把原序列分成若干段,每段分别解决。

我们可以对所有分数建虚树,对于虚树上的一条链,贡献次数只和链底子树内包含的分数下标集 X 有关,只要 [l,r]X 那么这条链上每个节点都对 fl,r+1 贡献,可以用启发式合并动态维护这些下标。

然后递归,维护一个分数集合 S,如果 S 中所有元素都在 mid=aL+aRbL+bR 的同一侧,那么根据刚才的做法求出 k 后直接转成子问题,否则二分出 S<mid>mid 的两个子集分别递归,然后在当前节点上启发式合并维护当前节点权值。

时间复杂度 O(nlogVlogn)

Submission Link




*5. [AGC058D] Yet Another ABC String

Problem Link

求有多少 aAbBcC 构成的字符串使得不存在子串 ABC,BCA,CAB

数据范围:a,b,c106

n=a+b+c

考虑容斥,钦定若干个 i 使得 s[i,i+2] 不合法,但是此时可能会同时钦定到 i,i+1 从而导致两个不合法段拼起来了。

因此我们不妨枚举极长的被钦定不合法的段,先求容斥系数,设 pi 表示段长为 i 时的容斥系数,那么考虑上一个被钦定的位置有 pi=pi1pi2

边界条件是 p2=0,p3=1,从而得到 p3k=1,p3k+1=1,p3k+2=0k>0)。

枚举每一段的长度,会发现此时的序列形如:若干个被钦定的 ABC 循环串和一些没限制的字符。

  • 长度为 3k 的串相当于 kABC,但有 3 种方法选颜色。
  • 长度为 3k+1 的串相当于 kABC 和一个自由字符。
  • 自由字符可以看成 k=0 的长度为 3k+1 的串。

因此设 fi,j 表示当前字符串长度为 i,钦定 jABC 循环串的容斥系数,有转移:

fi,j=k0fi3k1,j13k1fi3k,j

答案为 (n3iai,bi,ci)fn,n3i

考虑如何求 f,用二元生成函数,设 F(x,y)=fi,jxiyj,转移系数为 G(x,y),那么 F(x,y)=k0Gk=11G

其中 G(x,y)=k0x3k+1y3k1x3k=xy3x31x3,因此 F(x,y)=1x31xy+2x3

我们只要求 [xuyv]11xy+2x3 即可,即 [xuyv]i0(xy2x3)i,那么最终对答案有贡献的项就是 (xy)v(2x3)(uv)/3,直接计算二项式系数即可 O(1) 计算。

最终答案需要 O(n) 项系数,预处理组合数后直接计算即可。

时间复杂度 O(n)

Submission Link




6. [AGC058E] Nearer Permutation

Problem Link

对于两个长度为 n 的排列 p,q,定义它们的距离 d(p,q) 为:

  • 每次交换 p 中相邻两个元素,使得 p=q 的最小操作次数。

定义单位排列 I=(1,2,,n),定义 f(x) 为字典序最小的排列 z 满足 d(x,z)d(I,z)。例如当 n=3,x=(2,3,1)f(x)=(2,1,3)

给定排列 q,判断是否存在排列 p 满足 f(p)=q

数据范围:n3×105

以下过程排列下标均为均为 0n1

先考虑一种求 f(p) 的算法:从 f(p)=p 出发,每次尝试令字典序最小进行贪心调整:

  • s=inv(p)/2
  • 进行如下操作 n 次:求出 min{p0,p1,,ps}=pk,把 pk 插入答案序列 q 的末尾并删除,然后令 ssk

这个过程相当于贪心,每次这样的操作肯定会选取一个前缀最小值,而移动该前缀最小值对 d(p,q)d(I,q)2k 的贡献,因此 k 的上界就是 inv(p)/2

观察 q 序列,如果存在某个位置使得 qk>qk+1(没有说明 q=I,显然 f(I)=I)。

那么说明 qk+1p 排列中一定是等到 qk 删掉后才进入可能被选范围内。

考虑删除 qk 前的 p 序列,此时 ps+1=qk+1p0=qk,并且插入 qk+1s=0,因此 qk+2qn 与剩余的 p 序列一致。

我们只需调整 p0pk1 使得操作 k 次后 p 满足如上性质即可。

先令 q=p,然后依次考虑 qk+1,qk1,qk2,,q0,每次把当前元素 qi 向后移动 c 位满足 qiqi+1qi+c,若 i=k+1 则需满足 qkqi+1qi+c

我们希望删除 qk+1 前其在 p 中的位置 x 与当前的 ssx=y 尽可能小。

那么把 qi 向后移动会使得原序列逆序对数 +1,删除时花费代价 +1,最终使得 y 减小 0.5

因此我们要让 ci=inv(q)/inv(q)1,贪心让每次 ci 尽可能取最大即可。

时间复杂度 O(nlogn)

Submission Link




*7. [AGC058F] Authentic Tree DP

Problem Link

对于一棵 n 个点的树 T,定义 f(T) 为:

  • n=1f(T)=1
  • 否则对于所有 eT,设 Te,1,Te,2 为切掉这条边形成的两棵子树,那么 f(T)=1nef(Te,1)×f(Te,2)

给定 T,求 f(T)modP 的值。

数据范围:n5000

看到这个模型,考虑编一个组合意义:在每条边中间插一个点,那么 f(T) 就是随机排列每个点的标号,使得新加入的点标号都大于其邻居的方案数。

那么 f(T) 的定义相当于枚举最大值所在的位置,但是我们会发现此时的分母为 12n1,我们需要调整,不妨给加入的每个点下面挂 P1 个点,那么在模意义下分母为 1n

然后我们可以考虑容斥,把边大于其父亲的限制容斥,那么所有的限制都形如儿子小于父亲,所有事件都独立,只要维护每个点为根的连通块大小即可。

转移时类似树形背包,动态枚举每条边断不断即可。

时间复杂度 O(n2)

Submission Link




8. [ARC153E] Deque Minimization

Problem Link

给定十进制串 X,记 f(X) 表示按如下方式能得到的最小十进制串 Y

  • 从高到低考虑 X 的每一位,分别加入 Y 的首部或尾部。

给定 Y,求有多少 X 使得 f(X)=Y

数据范围:|Y|2×105

考虑 f(X) 的计算过程:显然对于当前位,如果小于 Y 的首位就放到队头,如果大于 Y 的首尾就放到队尾,如果等于 Y 的首尾,由于放到队头的若干个数单调不降,因此放到队头也一定更优。

因此我们可以得到一个区间 dp:fl,r=fl+1,r×[YlYl+1]+fl,r1×[Yr>Yl]

把整个转移写在网格图上(图源官方题解):

要求的就是从 (i,i)(1,n) 的路径数量和,注意到很多位置与 (1,n) 不连通。

首先我们发现,如果 Y[1,l] 不是单调递增的,那么 (l,r)(1,n) 不连通。

因此我们要考虑的 l 一定是前缀递增的一个连续段,这些区域有一个很好的性质,就是所有向上走的转移(fl,rfl1,r)始终都是存在的,那么可以考虑倒着维护每一行,即 l 递减地维护 fl,

暴力转移肯定不优,不妨尝试把这段递增前缀中值相同的缩起来,这样我们就只要处理 O(|Σ|) 个连续段了。

对于相同的一段 Y[a,b],观察网格图的形状:左侧是一个只能向上走的阶梯,那么 fa,afa,b=1

然后右侧是若干连续向右的矩形转移,直到 (b,n] 中第一个 x 使得 Yx>Yb,那么 [b,x) 这个范围内所有 fl,rfl,r+1 的转移都是存在的。

可以发现 f[a,b],[x,n] 这个范围内的值无法被某个 fi,i 转移到,也不需要考虑。

那么我们只要考虑 fb,[b,x)fa,[b,x) 的过程,容易发现这就是进行了 k=ba+1 次前缀和操作。

根据插板法可以直接算出多次前缀和的转移系数:fb,ifa,j 的系数为 (ji+k1k1),因此直接卷积一遍就能快处理 k 阶前缀和。

时间复杂度 O(|Σ|nlogn),其中 |Σ|=9

Submission Link




9. [ARC153F] Tri-Colored Paths

Problem Link

给定一张 n 个点 m 条边的无向简单连通图,求有多少种给边染色 {1,2,3} 的方法,使得至少存在一条简单路径上有三种颜色。

数据范围:n,m2×105

注意到限制比较松,我们可以考虑染了三种颜色但没有这样路径的方案数。

先考虑树的情况,取某条极长路径 uv,显然路径上只有两种颜色,不妨假设第三种颜色在树上某个点 w 子树内。

那么 uw 整个部分不能包括两种颜色,同理 wv 部分也只能有一种颜色。

因此我们还能证明这样的 w 至多一个。

方案数就是 f(degu),其中 f(x)=3x2x+3

因此对于一棵树,合法的染色方案一定存在恰好一个节点,使得该节点每个子树内都染相同颜色。

然后考虑一般情况,先缩点,对每个点双联通分量内部讨论:

  • 存在一个长度 4 的环,此时整个点双联通分量只能染同一颜色,否则必然存在一条路径从任意一个点出发经过两种颜色,此时这个点往外连第三种颜色即可(手玩可以得出结论)。
  • 否则该点双连通分量中只有三元环,先假设每条边颜色各不相同:
    • 手玩发现如果环上存在两个点 u,v ,以及环外两点 x,y 使得 xu,yv 存在(xy)那么这个环不能染 >1 种颜色。
    • 否则分类讨论:如果 u,v,w 都只和 1 个环外点相连,那么此时三元环可以染三种颜色,然后环外边染该点在环上对边的颜色,恰有 6 种方案,这种情况只在 n=4,m5 时出现。
    • 否则这个点双一定恰为三元环,且恰有一个点 u 向外连边(假设 n>3),手玩发现三元环必须染三种不同颜色,且环外所有边必须都染 u 对边颜色,也只有 6 种方案。

否则所有点双都同色,类似树的结论,可以在圆方树上恰取出一个圆点使得其每个子树染相同颜色。

答案还是 f(degu),但 u 是圆方树上所有圆点。

时间复杂度 O(n+m)

Submission Link




10. [ARC154E] Reverse and Inversion

Problem Link

给定一个 1n 的排列 pm 次操作,每次随机一对 1lrn 并翻转 plpr

对于最终的每个排列 q1qn,计算 i<j[qi>qj](ji)

数据范围:n,m2×105

考虑计算每个 i 对答案贡献的系数,容易发现这就是:

j<i[qj>qi]i<j[qi>qj]=(i1)j<i[qj<qi]i<j[qi>qj]=(i1)(qi1)=iqi

因此答案就是 i2i×qi,第一部分很好统计,我们只需要对于每个 pi 求出其最终所在位置的期望。

可以发现对于每个 i,一次操作后使得 ij 的方案数与使得 inj+1 的方案数是相等的。

因此对于每个 i,有 (1i(ni)n(n+1)/2)m 的概率留在原地,剩下的情况所在位置的期望是 n+12

那么就可以快速计算每个 pi 最终位置的期望。

时间复杂度 O(nlogP)

Submission Link




*11. [ARC154F] Dice Game

Problem Link

给定一个 [1,n] 的随机变量,对于 i[1,m] 求随机出 1n 每个数至少一次的随机次数的 i 次方的期望。

数据范围:n,m2×105

假设 F(z) 为对应的 PGF,即 [zk]F(z) 表示随机恰好 k 次后得到所有面的概率,那么考察 F(ez) 得到:

[zi]F(ez)=[zi]k=0fki=0(kz)ii!=k=0kifki!

因此 F(ez) 就是答案的 EGF。

先考虑求 F(z),从朴素 dp 开始:设 fi,j 表示随机 j 次后已经得到 i 个数的概率,那么:fi,j=infi,j1+ni+1nfi1,j1,用 Fi(z) 表示 zjfi,j 得到:

Fi(z)=z(inFi(z)+ni+1nFi1(z))=z(ni+1)nizFi1(z)=zinij=1i(njz)

那么最终的 F(z)=znFn1(z)=zn(n1)!i=1n1(niz),不妨设分母为 G(z),可以通过分治 NTT 算出。

由于 F(z) 为无穷级数,并不方便直接带入 F(ez),那么我们可以把 ez 带入右侧得到 F(ez)=ezn(n1)!G(ez)

G(z)n1 次多项式,求 G(ez)modzm+1 可以这样推导:

G(ez)=i=0n1gij=0m(iz)jj!=EGFi=0n1gi1iz

其中 EGF 算子表示把 i 次项系数除以 i!

而这个函数也可以通过分治 NTT 维护通分后的分子分母。

最后多项式求逆除一下得到 G(ez),再求逆除一下得到 F(ez) 即可。

时间复杂度 O(nlog2n+mlog2m)

Submission Link




12. [ARC155D] Avoid Coprime Game

Problem Link

给定 a1anx=0,A 和 B 轮流选择 ai 并令 xgcd(x,ai),不能重复用 ai,谁把 x 变成 1 就输。

对于每个 ai,求出 A 第一步操作该数后谁会赢。

数据范围:n2×105

注意到 xai 比较麻烦,否则如果每次 x 严格变小,我们可以简单 dp 求胜负态。

fx 表示当前胜负状态,那么 fx=OR{fyai:gcd(ai,x)=y},容易证明这一步取的 ai 不可能被取过。

判断是否存在 ai 是简单的,先求每个 x 的倍数数量,然后从大到小枚举 yx,把 y 的因子中 ai 作为倍数的数量出现次数减去 y 的倍数的数量。

但是我们现在可能可以不让 x 变小,即拖延时间。

我们发现一个人会拖延时间当且仅当 fx=0,那么两个人会拖延时间直到所有 x 倍数被选完。

那么我们需要记录 x 的倍数已经用了几个,进一步发现只关心 x 倍数被选择个数的奇偶性就行,显然选择 x 的倍数的数量和操作数量相等。

那么跟上面类似 dp 即可,最后处理拖延时间的情况。

时间复杂度 O(nlog2n)

Submission Link




*13. [ARC155E] Split and Square

Problem Link

S 是由 nm 位二进制数组成的集合,定义 f(S) 表示 {iji,jS}

一次操作可以选定 TS,使得 Sf(T)f(ST),求使得 S={0} 的最小操作次数。

数据范围:n,m300

这种问题先考虑 S 的线性基 e1ek,设最终 e1esT,es+1ekST

那么我们知道 f(T) 包含 e1e2e1es,并且他们之间线性无关(任取一个子集显然异或和不为 0)。

那么 f(T) 线性基大小 s1,同理 f(ST) 线性基大小 ks1,因此线性基大小每次至多 2

然后我们分析每次线性基大小减小的下界,假如我们只想让新的 S 线性基大小减一,这是简单的,把 S 里的数唯一表示成 e1ek 的异或和,表示方式中包含 e1 的全部放进 T

那么容易证明 f(T)f(S) 的张成空间维度 k1(可以用 e2ek 表示所有数)。

那么这样操作每次线性基大小至少 1

再进一步分析:注意到操作一次之后 0S,且以后该性质一直成立,不妨假设在操作的时候 0,e1ekT,那么 f(T) 依然满足这个条件,那么 f(T) 的线性基大小 k.

那么第二次操作以及之后每次操作不可能令 f(T),f(ST) 的线性基大小同时 1,因此每一步都只可能令线性基大小 1

那么我们只要特殊处理第一次操作,我们又发现令 S 的每个数异或上 S0(某个元素)显然不会影响 f(T),f(ST) 的值,那么这样我们就又转化成了 0S 的情况。

因此我们只要求出这个新集合的线性基大小即可,std::bitset 优化一下。

时间复杂度 O(nm2ω)

Submission Link




14. [ARC156D] Xor Sum 5

Problem Link

n 个值 c1cn 填入 a1ak,可以重复(相等的 c 算不同元素),求所有 i=1kai 的异或和。

数据范围:n,ci1000,k1012

首先根据 Lucas 定理 (nm)mod2=[mn],那么假设我们知道 c1cn 的出现次数 b1bn

那么对应的方案数 (kb1,,bn) 为奇数当且仅当 b1bn 构成了 k 在二进制下的一个划分,即 ij,biANDbj=0

那么我们只要知道每个 k 的二进制位被哪个 ci 选了即可。

从低到高考虑每一个二进制位 d,可以直接 dpi 记录前面的位对当前的进位为 i 的方案数,如果 dk 则枚举 ai,加入 ai×2d

注意 2n 时如果 d 小于 k 的最高位,这些方案数始终是偶数,不能计算贡献(最高位有 n 中方案)。

显然进位数不超过 2V,直接 dp 即可。

时间复杂度:O(nVlogk)

Submission Link




15. [ARC156E] Non-Adjacent Matching

Problem Link

给定 n 个点 1n,定义一张图是好的需要满足:

  • (1,2),(2,3),,(n,1) 之间没有边。
  • 每个点度数 m
  • 所有点度数和 k

求有多少 x1xn 可以作为一张好图的度数序列。

数据范围:n,m3000,knm

S=i=1nxi,一组序列合法当且仅当:

  • 2S,Sk
  • i[1,n] 满足 xi+xi+1S/2
  • i[1,n] 满足 xi[0,m]

可以验证这就是合法的充要条件,构造每次取一个 xi+xi+1=S/2 的点和任意一个其他的点连起来即可。

然后考虑对这样的序列计数。

我们容斥枚举 xi+xi+1>S/2 的位置数,容易证明不满足的位置 2 个。

先考虑没有钦定位置的情况,直接容斥得到方案数为:

S=0k[2S]i=0n(1)i(ni)(S+n1(m+1)in1)

对于 S[0,k],最后一个式子是若干组合数的前缀和,对上指标奇偶性分类即可。

然后考虑钦定一个位置的情况:

枚举这两个位置的和 t,暴力枚举这两个位置的所有分配,那么剩余位置的和 <tkt

dp 预处理求出 n2[0,m] 中变量凑出 <t 的方案总和,容易发现 t2m,因此前缀和优化 dp,时间复杂度为 O(nm)

由于还要钦定具体位置,所以最后答案记得 ×n

对于钦定两个位置的情况,容易发现这两个位置一定相邻。

设对应的三个元素分别为 x,t,y,剩余部分的和为 s,那么所有限制为:

{x+t<y+st+y<s+xx+s+t+yk2x+s+t+y{|yx|<tsy+xktsy+xts(mod2)

可以对所有 (x,y) 二维前缀和出数量,枚举 s,t 即可,对于剩下 n3 个元素的方案同样用 dp 出来的结果即可。

这一部分的答案也要记得 ×n

时间复杂度 O(k+nm)

Submission Link




16. [ARC156F] Make Same Set

Problem Link

给定 a1an,b1bn,c1cn

对于每个 iai/bi 加入 Sai/ci 加入 T,求最大的 |S| 使得 S=T 并输出方案。

数据范围:n5000

先考虑可以不加入 ai/biai/ci 的情况,这相当于类似三分图匹配的模型,建网络流即可解决。

不妨猜测这个问题的答案就是最终问题的答案。

显然答案不可能更大,我们只要保证 |ST| 不变,然后使得 S,T 对称差变成 0

我们考虑调整法:

  • 如果 aiS,aiT,biTbiS 也同理),直接令 bi 加入 S,显然 aiST,那么此时对称差变小,是一种合法的调整。
  • 否则对于任意 aiTbiT,显然 ciT,此时令 ai 同时加入 S,T
    • 如果 ciS,那么 ST 不变,下一次操作可以调整掉 ci 使得对称差变小。
    • 否则 ST 变大,对称差变小。

那么我们只要 O(n) 次调整即可。

时间复杂度 O(n2)

Submission Link




17. [ARC157E] XXYX Binary Tree

Problem Link

给你一棵二叉树(儿子数 0/2),你需要给每个点黑白染色,使得对于 n1 条父亲到儿子的边中:

  1. A 个黑 - 黑。
  2. B 个黑 - 白。
  3. C 个白 - 黑。
  4. 没有白 - 白。

数据范围:n104

首先所有白色都是独立集,因此有 B/B+1 个白点(根据根的颜色决定)。

并且每个白点对 C 的贡献都是 02,因此有 C2 个非叶节点。

因此我们要找一个独立集包含 B 个点和 BC2 个叶子,或者 B+1 个点和 BC2+1 个叶子。

那么我们可以 dp,设 fu,i 表示 u 子树选 i 个叶子,独立集最大是多少,转移直接树形背包。

时间复杂度:O(n2)

Submission Link




*18. [ARC157F] XY Ladder LCS

Problem Link

给定两个长度为 n 的 01 串 s,t,你可以交换若干对 (si,ti),最大化 LCS(s,t) 并输出之,如有多解输出字典序最小的一个。

数据范围:n50

首先对于每一对匹配的 si,tj,可以通过交换 (si,ti),(sj,tj), 使得所有 i>j

那么我们有一个暴力的做法:维护 dpi,Q,表示考虑到了 s[1,i],设最后一次匹配是 sj,tk,那么 t[k+1,i]=Q

转移时枚举是否交换,是否匹配,如果把当前的 si 匹配了,那么就从 Q 的前面开始往后找,找到第一个 Qp=si,然后删掉 Q[1,p]

这样复杂度是 O(n2n) 的,难以通过。

观察到答案看起来比较大,事实上可以通过暴力枚举证明对于连续的 3 个位置,无论他们怎么排序,都有一种操作方式使得他们的 LCS2

因此答案 2n3,因此 |Q|n3 一定不是最优解,那么此时状态数就优化到了一个可以接受的范围。

根据题目的要求,我们要按长度为第一关键字,字典序为第二关键字比较信息,显然 可以在最高位前面加一个 1 作为符号位,那么符号位越高说明长度越大,为了求字典序最小值,把其他位 01 翻转即可,同理 Q 也能这么表示。

时间复杂度:O(n2n/3)

Submission Link




*19. [Hitachi20F] Preserve Diameter

Problem Link

给定一棵 n 个点的树 T,求有多少种在树上加边的方式使得得到的新图 G

  • 无重边自环。
  • 直径长度不变。
  • 对于任意一对未连接的点对,连边后图的直径都会变小。

求合法 G 的数量。

数据范围:n2×105

首先我们发现,如果 G 中直径不唯一,我们可以通过缩短某条直径的不重合部分保证答案不变,因此原图直径必须唯一。

考虑 G 中的直径 s,t,建立以 s 为根的 BFS 树,那么这个图合法当且仅当没有与 t 同层的其他点,并且所有连接相邻层或同层的点都已被连接。

因此一组合法的 dis(s,1)dis(s,n) 与一个 G 构成双射。

我们发现一组 dis 合法当且仅当 (u,v)T:|disudisv|1,因此暴力枚举每条边的权值,dp 时维护 u 子树内有没有深度为 distdisu 的点即可,当然我们的限制是至少一个,因此还要记录值是 0/1/2,转移时枚举 disudisv{1,0,1} 即可。

但我们这样解决问题还要枚举直径起点,比较好的想法是枚举直径中点,然后 dp 时维护子树内深度为的 distdisu,disudist 两种点分别有多少,两侧分别取出恰好一个点作为直径端点。

对于直径长度为奇数的边,把这条边切掉形成两棵子树分别 dp 即可。

时间复杂度 O(n)

Submission Link




20. [ABC274Ex] XOR Sum of Arrays

Problem Link

给定 x1xnq 次询问 x[a,b]x[c,d]x[e,f] 的字典序大小关系(两个序列的异或定义为所有元素对位异或)。

数据范围:n5×105,q5×104,xi1018

显然只要求出最大的 k 使得 x[a,a+k1]x[c,c+k1]x[e,e+k1]=0 即可。

那么我们自然考虑设计一个哈希函数维护这个过程,但普通的字符串哈希函数不支持异或,即 (ai×B)(aj×B)(aiaj)×B,即 × 没有分配律。

注意到异或又能看成二进制下不进位加法,且乘法对加法有分配律,那么我们要单独看这个二进制数的每一位,可以用向量来看待,因此我们可以设计矩阵来描述哈希函数信息。

k=log2V,那么把所有 ai 看成 k 维 01 向量,而 B 看成一个 k×k 的 01 矩阵,在 mod 2 意义下做矩阵加乘,此时 + 等价,故具有分配律。

(,AND) 矩阵乘法可以用位运算优化到 O(k2),矩阵乘向量可以优化到 O(k)

而在构造出哈希函数后,我们可以用倍增解决原问题,直接维护所有 a[i,i+2k1] 的哈希值即可。

时间复杂度 O(nKlogN)

Submission Link

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