2023-11-27 22:02阅读: 22评论: 0推荐: 0

Atcoder-Countings4

Atcoder-Countings4

[ABC231G] Balls in Boxes

Problem

n 个盒子,初始时第 i 个盒子内有 ai 个小球,进行 k 次操作后,每次操作等概率随机选择一个盒子放入一个小球,设 k 次操作后每个盒子的小球个数为 bi,那么得分为 i=1nbi。求出期望得分。

  • n1000,k,ai109

Solution 1

由于题意中的期望与计数的转化只是一个 nk 的事情,所以也把此题放进计数题单。

bi=ai+cii=1nci=k

答案为 E[i=1nbi]=E[i=1n(ai+ci)]。由于 ac 是独立的,可以把乘积部分拆开:E[i=1n(ai+ci)]=i=1nfiE[j=1nicj],其中 fi 表示在 a 序列中选 i 个相乘的乘积之和。f 可以简单地用 dp 解决。设 dpi,j 表示考虑 a 中前 i 个数,选其中 j 个数进行相乘的乘积之和,则有转移:

dpi,j=dpi1,j+dpi1,j1×ai

最后 fi 即为 dpn,i

接下来继续转化后面那堆抽象的 E[j=1nicj]

to be continued.

Solution 2

直接把答案写出来:

1nki=1nci=kk!i=1nci!i=1n(ai+ci)

两个乘积式可以并在一起看:i=1nai+cici!

对每个乘积项构造生成函数 Fi(x)=j=0ai+jj!xj=ex(ai+x)。改写答案:

ans=k!nk[xk]i=1nFi(x)=k!nk[xk]enxi=1n(ai+x)=k!nk[xk]i=0nixii!i=1n(ai+x)

此题暴力计算即可,当然可以加强到 105 用多项式做。之后补一下多项式做法。

Problem

一共有 N 个人,在 K 天中的第 i 天随机给 ai 个人发一块饼干。ci 为第 i 个人在 k 天中获得的糖果总数。求 c1×c2×c3×cN×(Na1)×(Na2)××(NaK) 的期望值 mod 109+7

$ 1\ \leq\ N\ \leq\ 1000 1\ \leq\ K\ \leq\ 20 1\ \leq\ a_i\ \leq\ N $。

Solution

ペアスコア

ジグザグな数列

Problem

给定一个长为 n 的序列 A,求有多少个满足条件的非空子序列 B,答案对 109+7 取模。条件满足下列之一即可:

  • 长度为 1
  • 长度大于 1,且 i[1,|B|),当 i 为奇数时,Bi<Bi+1;当 i 为偶数时,Bi>Bi+1
  • 长度大于 1,且 i[1,|B|),当 i 为奇数时,Bi>Bi+1;当 i 为偶数时,Bi<Bi+1

2n2×1051Ai109

Road Development in Peterland

Problem

给定一个 n 个节点、n 条边的无向连通图,边权均为 1。记 d(u,v) 表示 uv 的最短路距离,求:

1u<vnd(u,v)2

998244353 取模的结果。

Candy is Delicious

Problem

现有 n 个糖果排成一列,第 i 个糖果的美味值为 Ai,定义 f(l,r) 表示在第 l 个糖果到第 r 个糖果之间按如下方式选取糖果能获得的最大美味值总和:

  • 不能选取两个相邻的糖果。

1lrnf(l,r)998244353 取模的结果。

Erasure

Jumping over 2

Many Parentheses

One or All

Maximin Game

Problem

Alice 和 Bob 在玩一个游戏,初始时他们各有 n 张牌,这 2n 张牌的数值为 1,2,,2n 各一个。

游戏共进行 n 轮,每一轮双方各取出自己手中最小的牌,进行大小判定,数值大的一方获胜。一轮结束后,双方均把该轮出的牌丢弃。

现以一个长为 n01 字符串给出二人的胜负情况,求二人的初始卡牌分配方案数对 998244353 取模的结果。

1n105

Paint Red and Make Graph

色塗り

ティッシュ配り

[AGC026D] Histogram Coloring

Problem

给定 N 列的网格,每列高为 hi,将每个格子染色成红色或蓝色,使得每个 2×2 的区域都恰好有两个蓝格子和两个红格子,求方案数对 109+7 取模。1N100,1hi109

Solution

[ABC265F] Manhattan Cafe

Problem

n 维空间内我们定义两个点 x(x1,x2,,xn)y(y1,y2,,yn)曼哈顿距离d(x,y)=i=1n|xiyi|

如果一个点 x 的所有坐标均为整数,我们称其为整点。

给出 n 维空间内两个整点 p,q 和一个整数 D,求有多少个整点 rd(p,r)D,d(q,r)D

由于答案可能过大,你需要将答案对 998244353 求余。

1n100,0D1000,1000pi,qi1000

Solution

有一个简单的 dp:设 fi,x,y 表示考虑了 r 的前 i 维,且 j=1i|pjrj|=x,j=1i|qjrj|=y,则有 fi,x+|wpi|,y+|wqi|fi1,x,y

这样做是 O(nD3) 的,如果要沿用该 dp 状态,最佳的办法是避免枚举 w,对 fi+1,?,? 进行 O(1) 更新。

那就改写为这种写法:fi,x,yfi1,x|wpi|,y|wqi|。绝对值是麻烦的,直接暴力拆开绝对值。

  • pi=qi
    • max(pix,qiy)wpifi,x,yfi1,xpi+w,yqi+w
    • pi+1wmin(x+pi,y+qi)fi,x,yfi1,x+piw,y+qiw
  • pi<qi
    • max(pix,qiy)wpifi,x,yfi1,xpi+w,yqi+w
    • max(pi+1,qiy)wmin(qi,x+pi)fi,x,yfi1,x+piw,yqi+w
    • qi+1wmin(x+pi,y+qi)fi,x,yfi1,x+piw,y+qiw
  • pi>qi
    • max(qiy,pix)wqifi,x,yfi1,xpi+w,yqi+w
    • max(qi+1,pix)wmin(pi,y+qi)fi,x,yfi1,xpi+w,y+qiw
    • pi+1wmin(y+qi,x+pi)fi,x,yfi1,x+piw,y+qiw

然后发现 fi,x+w,y+w,fi,xw,yw,fi,xw,y+w,fi,x+w,yw 的贡献和可以分别以前缀和的方式 O(D2) 预处理出来。

[AGC058D] Yet Another ABC String

Atcoder:[AGC058D] Yet Another ABC String

洛谷:[AGC058D] Yet Another ABC String

Problem

给出 a,b,c,求由 a 个 A,b 个 B,c 个 C 构成的字符串数量,使得不存在子串 ABCBCACAB1a,b,c106

Solution

可能是 OI 生涯做过最神仙的容斥。

极长 非法子串(以下简称非法子串)个数进行容斥,容易发现,非法子串一定形如 ...BCABCABCABCAB... 的循环形式。也就是说,如果一个非法子串的长度和末尾字符确定,该子串就可以被唯一确定。

我们以一个非法子串的最后三位确定其位置。取末三位是为了在计算时保证该位置一定作为非法子串的结尾

n=a+b+c,m=n3i。枚举非法子串数量 i,然后先确定不是非法子串末三位的其它字符,方案数为 (mai,bi,ci)

然后确定这 i 个末三位的位置,以及进一步算出 钦定 i 个非法子串的方案数。

假设一个末位置为 p,如果 sp 存在一个后继 sp+1,则 spsp+1 存在限制,即 A 后不能接 BB 后不能接 CC 后不能接 A,否则就无法满足 极长 的条件。在一种确定的插入方案下,对于有后继的非法子串末位置,其后继是确定的,故末位置的填法有 2 种,对应这个非法子串的方案有 2 种。相应地,如果非法子串的末位置没有后继,那这个子串就有 3 种方案。

上述仅考虑了非法子串的末尾字符对非法子串方案数的影响。考虑非法子串的长度,可以反过来将所有非法子串的末位置确定,而剩下的 n3i 的所有情况,可以将非法子串的长度取遍。

总结一下非法子串的方案数,为:(m+i1m1)×2i+((m+im)(m+i1m1))×2i1×3。简单插板法,略去说明。

总答案为:

Ans=i=0min(a,b,c)(1)i×(mai,bi,ci)×((m+i1m1)×2i+((m+im)(m+i1m1))×2i1×3)

code AGC058D

[AGC051D] C4(2807)

Problem

有一张 4 个点 4 条边的简单无向连通图,点的编号分别为 1,2,3,4 ,边分别连接着 e1:(1,2),e2:(2,3),e3:(3,4),e4:(4,1)

给定 4 个数 v1,v2,v3,v4 求满足以下条件的路径数量:从 1 号点出发并到 1 号点结束,且经过第 i 条边 ei 恰好 vi 次。

你需要输出路径数对 998244353 取模的结果。v1,v2,v3,v45×105

Solution 1

省流:做不起。

官方题解的做法是 FFT 的 O(nlogn)​​。

首先有一个阳间的结论:a,b,c,d 必须满足奇偶性相同才有可能存在的路径。

你把从 1 开始、到 1 结束看成一轮游走,则很自然地想到把游走分为两类:1.接过去;2.绕回来。

一类游走对每条边增量为奇数,二类游走对每条边增量为偶数。结论显然。

考虑路径由这些部分组成:1.正常地走;2.在一条边上反复横跳。

反复横跳之后的结果是:一条边的遍历次数 +2,而你处在的位置并没有发生变化。

这启发我们,是不是可以先考虑正常地绕圈,然后再这个过程中插入反复横跳?

这个想法是好的,但不容易描述出一个实际的做法。

而官方做法刻画出了一个人类智慧的路径形式,将一轮游走继续划分成更小的 “二段式跳跃”:

  • 123321,称为一类跳跃。
  • 143341,称为二类跳跃。
  • 121141,称为三类跳跃。
  • 323343,称为四类跳跃。

三、四类跳跃即是上文提到的反复横跳。但是你注意到,我们只考虑了将 1,3 作为起点的反复横跳,而对于 2,4 作为起点的反复横跳 —— 即 212​ 这样的形式 —— 被包含在了一、二类跳跃之中 —— 一类更容易计算的跳跃之中。

这个思想对于事物的观察并不拘泥于事物的属性,而是如何寻求事物之间的和谐,构建一个奠基于事物而又超脱事物本身的整体。

是的,分散的反复横跳扰乱了一个简单的进程,而我们仍在思考一轮轮游走,看不透他们的存在。

当我们将混沌的游走肢解,一个不合理的刻画就此打破,而反复横跳被我们逐步包容。

我也曾在时间流速为一单位的四元环上反复横跳,可他们已经学会了用二单位的流速在其间穿梭。

我们可以重新去刻画一条完整的路径了。

首先确定一、二类跳跃。为方便叙述,我声称只有一、二类跳跃的路径是一条简单路径,而原路径被称为最终路径。

枚举一类跳跃走了 i 个,二类跳跃走了 j 个,将这 i+j 步跳跃进行排列,则每一步具体是什么跳跃是确定的,即一种排列情况唯一确定一个简单路径。不同的排列一定对应不同的简单路径,而经过三、四类跳跃的加入后,不同的排列也一定对应着不同的最终路径(因为三、四类跳跃前后,当前所处位置是不变的)。于是一、二类跳跃之间的定序带来 (i+ji) 的乘积贡献。

确定三类跳跃:我们惊喜地发现,121141 的数量分别可以定下来,分别为:ai2dj2。还要考虑将三类跳跃与形如 11 的若干段路径之间进行定序(即 1 经过至少两个点后重新绕回 1),后者的数量为 i+j2。所以将三类跳跃加入后,带来(ai2+dj2+i+j2ai2,dj2,i+j2) 的乘积贡献。

同理去确定四类跳跃。323 的数量为 bi2343 的数量为 cj2。而由一、二类跳跃构成的形如 33 的路径段的数量为 i+j21(因为是从 1 出发的,到达 3 和回到 1 分别都要用掉一次一类或二类跳跃)。定序,带来 (bi2+cj2+i+j21bi2,cj2,i+j21) 的乘积贡献。

然后整理答案。

ans=i,j(i+ji)(ai2+dj2+i+j2ai2,dj2,i+j2)(bi2+cj2+i+j21bi2,cj2,i+j21)=(a+d2)!(b+c21)!i,j(i+j)!(i+j2)!(i+j21)!×1i!(ai2)!(bi2)!×1j!(bj2)!(dj2)!

注意一些细节:这里的 i,j 二元组如果使得上式中任意一个分式结果不为整数,则该二元组没有意义,因为路径一定不合法。

你发现我已经把答案化成了卷积的形式,直接用 FFT 优化即可。没有意义的项系数赋为 0 即可。

code AGC051D - solution1

Solution 2

省流:还是做不起。

洛谷题解区以及场上大部分切掉的神仙的做法都是转成了欧拉路径计数。

Solution 3

省流:没必要省流了。

[ARC149E] Sliding Window Sort

Problem

给定正整数 N,M,K。考虑对某个正整数数列 A=(A0,,AN1) 做如下操作:

  • 对所有 k=0,1,,K1 依次做一遍如下操作:
    • AkmodN,A(k+1)modN,,A(k+M1)modN 升序排序。

给定一个 1N 间整数的排列 B={B0,,BN1}。求经过上述操作后与 B 相同的 A 的数量,对 998244353 取模。

2N3×1052MN1K1091BiNij,BiBj

Solution

[ARC057D] 全域木

Problem

给定 N1 个数 A1,A2,,AN1 ,求满足其最小生成树边权升序排列为序列 {A} ,且所有边权为 1N×(N1)2 的排列的 N 阶完全图数量。 答案对 109+7 取模。

1N301AiN(N1)2。保证 Ai 两两不同。

Solution

[ABC319G] Counting Shortest Paths(2185)

Atcoder:[ABC319G] Counting Shortest Paths

洛谷:[ABC319G] Counting Shortest Paths

Problem

经典问题:求补图的最短路,边权均为 1,并顺带求出 1n 最短路的数量。n2×105

Solution

每次从队列中把最早遍历到的节点 u 取出来,更新所有未被遍历并且与 u 有边相连的节点 v 的距离:dv=du+1,标记 v 已被遍历,并把 v 加进队列。由于每个节点只会被遍历到一次,但维护未被遍历的点集以及快速查询 u,v 是否存在连边需要用到 set,因此求出 1 到每个点的最短路长度 d 的时间复杂度是 O(nlogn) 的。

求最短路数量就很简单了,记 fu 表示 1u 的最短路数量,按 d 从小到大遍历点,记 si 表示 d 数值为 i 的所有节点的 f 之和。

fu=sdu1v,dv=du1,v is not connected to ufv。这部分的时间复杂度也是 O(nlogn) 的。

warning:不要同时遍历 set 和删除 set 内的元素。

code ABC319G

[AGC023C] Painting Machines(2568)

Atcoder:[AGC023C] Painting Machines

洛谷:[AGC023C] Painting Machines

Problem

  • 有一排 n 个格子,从左到右编号为 1n
  • n1 个机器,从左到右编号为 1n1,操作第 i 个机器可以将第 i 个和第 i+1 个格子染黑。
  • 定义一个 n1 的排列 P 的分数为,依次操作 P1,P2,,Pn1,第一次染黑所有格子的时刻。
  • 求所有排列 P 的分数之和,对 109+7 取模。
  • 1n106.

Solution

好菜啊。

对每一步操作累计贡献,记 Fi 表示执行完第 i 步时未能使所有格子染黑的排列数,则 ans=(n1)!+i=1n1Fi,加上 (n1)! 是因为对每一个排列,都还需要最后一步将所有格子染黑。

Fi 是不好求的,但我们能发现所有格子都被染黑时的一个性质,那就是被操作的相邻两个位置距离不超过 2,所以我们不妨记 Gi 表示执行完第 i 步时使所有格子染黑的排列数,则 ans=(n1)!+i=1n1((n1)!Gi)

现在来求 Gi,显然当 in2Gi 才不为 0。我们发现现在需要确定的是前 i 步操作的位置集合,而与它们之间的操作顺序没有关系。记 wi 表示使得所有格子被染黑的前 i 步操作位置集合的方案数,则 Gi=wi×i!×(n1i)!

立即想到可以进行 dp,但先别急,这个可以直接组合意义导出来。

套路地([ABC276G] Count Sequences)想到对位置进行 差分,记 a1,a2,,ai(a1<a2<<ai) 表示位置集合,记 dx=axax1(1<xi),则需满足:a1=1,ai=n1,dx(1<xi){1,2}。进而得到 x=2idx=aia1=n2。这是简单问题了,先给所有 dx 安排 1 的基值,再从 i1dx 中选择 n2(i1) 个进行 +1。易得 wi=(i1ni1)

ans=n!i=n2n1(i1ni1)×i!×(n1i)!

code AGC023C

[ABC248G] GCD cost on the tree(2514)

Atcoder:[ABC248G] GCD cost on the tree

洛谷:[ABC248G] GCD cost on the tree

Problem

给定一颗树有 n 个结点,每个结点上有一个权值 ai, 对于每条至少包含两个点简单路径,它的贡献为 路径上点的数量(包括端点)×路径上所有点的 ai
的最大公约数。 求所有简单路径的贡献之和,对 998244353 取模。

1n1051ai105

Solution

最大公约数不太会处理,想到将 ai 质因数分解,对每个质数分别进行统计。以下只讨论枚举一个质数 p 的情况。

给每个赋点权 wi,表示 ai 分解质因数后 p 的次数。

从小到大枚举路径上(当前质数的)wi 的最小值 mn,对 mn 相同的路径进行统一计数,然后将所有次数为 mn 的点删掉。由于路径并不太好处理,所以还需考虑每个点在当前有多少个合法路径经过它。

具体流程如下:

  • 从小到大枚举 mn,并称 wx=mn 的点 x 为关键点。在处理当前 mn 的贡献之前,记录每个点当前所在连通块大小 si 及子树大小 szi,并将所有关键点删掉,重新 O(n) 建树以及 O(nα(n)) 建立并查集。

  • 记删点后每个点当前所在连通块的大小 si 以及子树大小 szi。计算点 u 的贡献:

    pmn×((su2)(su2)(vson(u),v is connected to u(szv2))(suszu2)+vson(u),v is connected to u(szv2)+(suszu2))

    简单解释一下:记删点前点 u 所在连通块为 S,删点后点 u 所在连通块为 S

    S 内总路径数减去 S 内路径数,表示除开未经过关键点的路径。

    另外,还要去掉未经过点 u 的路径数,并把同时不经过关键点和点 u 的路径数加回来。

  • mn+1,重复上述过程。若不存在关键点,则结束质数 p 的贡献统计。

算答案的时间复杂度不会算,硬要不规范地表示出来是 O((n+α(n))p\P,p105logp105)。有点离谱了。

吗的,第一句就爆了。

这下只能考虑直接枚举最大公约数的值了,记 Fx 表示最大公约数为 x 的路径的长度总和,则 ans=i=1105Fi×i

套路地进行容斥:记 Gx 表示最大公约数为 x 的倍数时的长度总和,则 Fx=Gxi>1,ix105Fix

1105 枚举 x,把所有为 x 倍数的点拉出来求 Gx,由于我们只在乎为 x 倍数的点,所以只要计算每个 Gx 时对每个点均摊时间复杂度是 O(1),那么计算 G 的总时间复杂度应该是 O(nd(V)) 的,其中 V 表示值域。

对于求 Gx,套路地以每个点作为最近公共祖先记录经过该点的路径信息。记 fi 表示 i 子树内所有路径(不包含长度为 1)的长度和,gi 表示 i 子树内以 i 为端点的路径长度和(包含长度为 1), hi 表示 i 子树内以 i 为端点的路径数量(包含长度为 1)(便于延展路径长度),简单做一个树形 dp 即可。注意我们只考虑为 x 倍数的点,因此现在处理的是一个森林,而不是一棵树。

总时间复杂度为 O(nd(V)+nV+VlogV)V 是处理倍数为 x 的点集,VlogV 是最后统计答案的调和级数。

question:写的时候才发现拉关键点的时候因为要遍历边,所以时间复杂度也许是假的。不太明白为什么能过。

[AGC028D] Chords(3491)

洛谷:[AGC028D] Chords

Atcoder:[AGC028D] Chords

Problem

给定一个圆, 圆上均等地放着 2n 个点, 已有 k 对点之间连好了线段, 从中选择剩下 nk 对点随意连线段(每个点只连一条线段).

两点联通当且仅当两点在同一条线段上或两点所属于的线段相交, 求所有连边方案中, 联通块的个数和.

1n3000kn

Solution

圆上问题大胆转成序列上的线段问题,然后显然是区间 DP。

拆贡献,对每种连通块计算其被统计到的次数。然而一个连通块并不一定对应一个完整的区间,因此需要将其跨越的区间内的所有点都进行配对的方案数顺带进行计算。

fl,r 表示所有以 l 为编号最小的节点、r 为编号最大的节点的连通块的 带权数量。我们实际统计的连通块是 l,r 所属的连通块,这里的带权指的是考虑把 [l,r] 内的所有点都进行配对。由于我们规定 l,r 是一个连通块的两端点,因此 [l,r] 内的所有点只会和该区间内的点进行连边。

cl,r 表示 [l,r] 内未连边(即输入给出的线段)的点数。

直接 DP 不好做,考虑 容斥,先让 [l,r] 内未连边的点随便连边,再去掉 l,r 不在同一连通块的方案数。

g(x) 表示 x 个点随意连边的方案数,则:

g(x)={0,x1(mod2)x!(x2)!2x2=1×3××(x1),x0(mod2)

枚举包含 l 的连通块的右端点的位置 i,对 fl,r 进行容斥计算:(注意需要保证该区间合法)

fl,r=g(cl,r)li<rfl,i×g(ci+1,r)

计算答案:对每个区间的带权连通块数进行二次计数:

ans=lrfl,r×g(c1,l1+cr+1,2n)

本题的核心思想是 拆贡献容斥,难点在于拆贡献的时候是一个 带权拆分

code AGC028D

[AGC058B] Adjacent Chmax(2053)

洛谷:[AGC058B] Adjacent Chmax

Atcoder:[AGC058B] Adjacent Chmax

Problem

给你一个 1n 的排列 P ,你可以进行若干次如下操作,也可以不进行操作。

  • 每次选择一个整数 i (1  i  N1) ,使 v=max(Pi,Pi+1) ,然后将 PiPi+1 改为 v

求问最后可能得到多少种不同的结果,答案对 998244353 取模。

2n5000

Solution

fi 表示考虑前 i 个位置能够变出的序列数量。

考虑 Pi 的影响区间为 [li,ri],则考虑 Pi 对该区间的填充实际上是对 f 在该区间内做一次 前缀和

而我们在只考虑 P1Pi 的时候就已经对 i+1ri 也进行的 f 值的更新,这一点体现了 费用提前计算 的思想。

code AGC058B

[ARC106D] Powers

Problem

给定长度为 n 的序列 a,以及一个整数 k。对于每个 1xk,求出如下式子的值:

l=1n1r=l+1n(al+ar)x

答案对 998244353 取模。

2n2×105, 1k300, 1ai108

Solution

插播一个傻逼题。

ansx=l=1n1r=l+1n(al+ar)x=l=1nr=1n(al+ar)xi=1n(2ai)x2

W=l=1nr=1n(al+ar)x

W=l=1nr=1ni=0x(xi)alxiari=i=0x(xi)l=1nalxir=1nari

O(nk) 对每个 x[0,k] 预处理 p=1napx

[ARC166C] LU / RD Marking

洛谷:[ARC166C] LU / RD Marking

Atcoder:[ARC166C] LU / RD Marking

Problem

给一个 nm 列的网格,那么它的所有网格线上共有 n(m+1) 条竖边,(n+1)m 条横边。

有如下两种操作:

  • 选一个上面和左面的网格线都没被涂黑的格子,并涂黑这两条线;
  • 选一个下面和右面的网格线都没被涂黑的格子,并涂黑这两条线。

求执行两种操作若干次(可以为 0),可能得到不同的涂黑边集数量。

T2×105, n,m106

Solution

插播一个没被傻逼做出来的题。

听说 liuhangxin 把这个题拿给数竞生做,结果 10s 就被秒了,恐怖如斯。

将矩形按折线分割,让操作独立成若干个子问题。

fx 表示长为 x 的折线有多少种填法:fx=fx1+fx2。这是斐波那契数!

若矩形边长为 n,m(n<m),则 ans=(f2f4d2n)2×f2n+1mn

code ARC166C

[ARC167C] MST on Line++

洛谷:[ARC167C] MST on Line++

Atcoder:[ARC167C] MST on Line++

Problem

给定正整数 n,K 和一个长度为 n 的序列 A。对于一个 1n 的排列 P,我们定义 f(P) 为以下问题的答案:

给一个 n 个点的无向带权图,对于两点 i<j,当且仅当 jiK 时,它们之间有边,边权为 max(APi,APj)
求这个图的最小生成树边权和。

对于所有可能的排列 P,求出它们的 f(P) 之和,答案对 998244353 取模。

1K<N50001Ai109

Solution

插播一个没被傻逼做出来的题。

容易想到将 A 从小到大排序,然后钦定每个 Ai(2in) 作为一条边的边权,统计其在所有排列方案中的贡献。

然后这里进行了一步不太显然的拆贡献。考虑 Kruskal 算法的思想是让 边权小的边数尽可能大:记 fi 表示所有排列中完全在 A1i 内的边的最大数量之和,则 Ai 在所有排列中的贡献次数为 fifi1,即:

ans=i=2nAi×(fifi1)

下面计算 fx

从排列中选择 x 个位置填上 A 序列的前 x 个元素,把这些位置称作关键点。

为了使这 x 个关键点之间的连边数量尽量多,贪心地考虑只对相邻两个关键点连边一定可以取得边数最大值。也即,fx 的含义为,对所有序列 Q(x)={q1,q2,,qx}(1q1<q2<<qxn),统计 qiqi1K(2ix) 的相邻关键点对数量之和。

然后有一个 naive 的 DP 做法:记 gi,j 表示在 j 个位置中对所有 Q(i)(qi=j) 统计 qiqi1K(2ix) 的相邻关键点对数量之和。则:

fx=(x)!(nx)!i=1ngx,igi,jgi1,p,jp>Kgi,jgi1,p+(p1i2),jpK

容易用前缀和优化至 O(n2)code ARC167C - O(n2)

然而官方题解用组合意义推出来了一个可以直接算 fx 的式子,并且可以做到除排序外线性的时间复杂度。

进行拆贡献,对 x1 个关键点对分别计算。枚举做贡献的点对的距离:

i=1K(nix1)

实际上它可以由上指标求和转化为:

(nx)(nKx)

从另一个组合意义上来讲,这相当于总方案数减去强行让关键点对不做贡献的方案数。

于是可以直接得到:

fx=x!(nx)!(x1)((nx)(nKx))

O(1) 计算 fx

Matching

洛谷:Matching

Atcoder:Matching

Problem

给定二分图,两个集合都有 N 个点,ai,j=1 表示第一个集合第 i 个点与第二个集合第 j 个点连边。

求二分图完备匹配数,答案对 109+7 取模。1N21

Solution

插播一道傻逼作业题。考虑对左侧点依次进行匹配,然后记录右侧点集还剩哪些点。

fi,S 表示考虑左侧点集的前 i 个点,右侧点集未被选中的点集为 S 的方案数。则有转移:

fi,S2jfi1,S,ai,j=1\andjS

答案即为 fn1,0。时间复杂度 O(n22n)

但其实每轮枚举的有效的 S 的数量总和是 O(2n) 的(每轮枚举有效的 S1 的数量是确定的),所以还可以砍掉一个 n,总时间复杂度 O(n2n)

code Matching - O(n2n)

[AGC016F] Games on DAG

洛谷:[AGC016F] Games on DAG

Atcoder:[AGC016F] Games on DAG

Problem

给定一个 n 个点 m 条边的 DAG,对于每条边 (u,v) 都满足 u<v1,2 号点各一个石头,每次可以沿 DAG 上的边移动一颗石头,不能移动则输,求所有 2m 个边的子集中,只保留这个子集先手必胜的方案个数,答案对 109+7 取模。

2n151mn(n1)2

Solution

插播一道厉害作业题。

直接丢 粉兔的题解 吧。

code AGC016F

チーム分け

Problem

N 个人分配到恰好一支队伍中,要求第 i 个人被分到的队伍大小不超过 ai。求分配方案对 998244353 取模的结果。

两个分配方案被认为是不一样的,当且仅当存在两个人,在一个分配方案中被分在同一支队伍,而在另一个分配方案中被分在不同队伍。

1N10001aiN

Solution

插播一道 zr 题。

[ABC180F] Unbranched

Problem

N 个点,M 条边且满足以下条件的图的数量:

  • 图中无自环。

  • 每个点度数最多为 2

  • 所有连通块最多恰好有 L 个点。

答案对 109+7 取模。

2N300,1M,LN

Solution

显然每个连通块只能是链。

[AGC056B] Range Argmax

[AGC056F] Degree Sequence in DFS Order

[AGC039E] Pairing Points

[AGC033E] Go around a Circle

[AGC019E] Shuffle and Swap

[ARC124E] Pass to Next

洛谷:[ARC124E] Pass to Next

Atcoder:[ARC124E] Pass to Next

Problem

n 个人站成一个圈,分别编号为 1n,编号为 i 的人右边为编号为 imodn+1 的人。初始第 i 个人有 ai 个球。

接下来,他们会选择一些自己手中的球(可以不选),接着所有人同时将选中的球传给右边的人(这意味着别人传过来的球是不能继续往下传的)。我们令传球后第 i 个人拥有的球数为 bi

S 为所有可能的序列 b 构成的集合。例如,a=(1,1,1),则 S={(0,1,2),(0,2,1),(1,0,2),(1,1,1),(1,2,0),(2,0,1),(2,1,0)}

xSi=1nxi998244353 的值。

3N1050ai109

Solution

di 表示 i 向下一个人传的球数。显然直接对 d 计数会产生重复,所以我们 只保留不计重的最小表示(统计等价类):如果所有 di>0,则令所有 di 减一,b 不变。

这样一来,在 d 的最小表示中,必然存在一个 di=0。 我们只对这样的合法 d 序列进行计数(diai)。那么容斥一下易知:

|S|=i=1n(ai+1)i=1nai

但是此题要求的是所有 b 序列的乘积和,这看上去是一个很可以 DP 的东西。我们仍然可以沿用容斥的思想,用 di[0,ai]d 序列的贡献减去 di[1,ai]d 序列的贡献。以下讨论 di[0,ai] 时的结果。

我们尝试用 d 序列表示答案:

ans=d1,d2,,dn(a1+dnd1)i=2n(ai+di1di)

fx=d1,d2,,dxi=2x(ai+di1di)。尝试写出 DP 转移:

fx=d1,d2,,dxi=2x(ai+di1di)=0dxax(ax+dx1dx)d1,d2,,dx1i=2x1(ai+di1di)=0dxax((axdx)fx1+dx1d1,d2,,dx1i=2x1(ai+di1di))

上面的操作将 dx 的取值与 d1,d2,,dx1 分离开来,而与 fx1 联系上,实现了 fxfx1 的关联。

现在问题在后面那坨式子,我们又设 gx=d1,d2,,dxdxi=2x(ai+di1di)。尝试写出 g 的 DP 转移:

gx=d1,d2,,dxdxi=2x(ai+di1di)=d1,d2,,dxdx(ax+dx1dx)i=2x1(ai+di1di)=0dxax(dx(axdx)+dxdx1d1,d2,,dx1i=2x1(ai+di1di))=0dxax(dx(axdx)+dxgx1)=ax(ax+1)(ax+3gx11)6

代回 f 的递推式:

fx=0dxax((axdx)fx1+gx1)=(ax+1)gx1+ax(ax+1)2fx1

然后可以 O(n) 处理出 f,g。但是现在有一个很烦人的问题:这是一个环。剩下的那一项 (a1+dnd1) 又该如何处理呢?f,g 的初始值又该赋成什么?

再想想烦人的原因 —— f,g 均与 d1 关联f2=d(a2+d1d2),f3=d(a3+d2d3)(a2+d1d2)......

我们多么希望将 d1 独立 出来!如果从一开始就把 d1 分离出来会发生什么呢?也即,让初始的 f2=d(a2d2) 做一遍 DP,再让 f2=d1d1 做一遍 DP,将二者得到的结果相加?

对于前者,初始化 f1=1,g1=0,而对于 (a1+dnd1)d1 的选取与 fn,gn 是独立的,可以想成将 d1 移到 dn 后面多做一次转移。

对于后者,直接将 f2=d1d1 作为初始值显然与我们要将 d1 独立出来的目的相悖,但我们可以将 d1 这一项乘积移到最后处理,即初始化 f1=0,g1=1,使得 f2=a2+1,并在最后统计 dd1i=2n+1(aidi+di1)n+1 是考虑将 d1 移到 dn 后面做一次转移),dn+1=d1。这不是 g 数组吗!!!

于是我们成功地破环成链了!!!只是这样的推导方式实在是有些生硬,颇有些碰运气的成分在里面。

题解区有另一种更加直观的组合意义做法,可以得到与上面相同的结果。

这种组合意义做法从根源上的差异在于,它这样看待答案的式子:

bi=1nbi=bi=1n(bi1)

它的组合意义是:传球结束后,每个人从自己目前拥有的球中选择一个的方案数。

做法的突破口在于:选取的球只有两种可能 —— 自己原来拥有的;上一个人传给自己的。

于是可以设计 DP 状态 dpi,0 表示考虑前 i 个人,第 i 个人选的球

[ARC124F] Chance Meeting

洛谷:[ARC124F] Chance Meeting

Atcoder:[ARC124F] Chance Meeting

Solution

被 ARC124E 完虐后来 找点自信 继续找虐。

首先有个很显然的思路:枚举唯一相遇点 (x,y),然后将过程拆分成 A,B 相遇前和相遇后。

下记 c1(x,y),c2(x,y) 分别表示 A,B 从起点出发到 (x,y) 相遇和 A,B 同时从 (x,y) 出发各自到达终点的方案数,记 q(x,y) 表示 A,B 唯一(x,y) 相遇的方案数。

c1(x,y)=(x1+y1x1)(nx+y1nx)(x1+y1+nx+y1x1+y1)c2(x,y)=(x1+myx1)(nx+mynx)(x1+my+nx+myx1+my)

然后我立马给出了一个错误式子:

q(x,y)=c1(x,y)×c2(x,y)

直接这么算会计入不合法情况:A,B 有可能在除 (x,y) 以外的地方相遇。

不过方便的是,当我们确定 (x,y) 后,其它可能相遇的位置一定是 (x,i),即 A,B 会在第 x 行经历一段相同的路径并多次追及相遇。

又记 w1(x,y) 表示表示 A,B 从起点出发并 唯一(x,y) 相遇的方案数,w2(x,y) 表示 A,B 同时从 (x,y) 出发并且 之后不再相遇 地各自到达终点的方案数,则下列的计算式就是正确的:

q(x,y)=w1(x,y)×w2(x,y)

考虑 容斥 计算 w1,w2,枚举 (x,y) 前后最近的相遇位置,并钦定 (x,i)(x,y) 内的路程不能相遇。对于后者,可以看作是必须被一层外层括号包起来的 |yi| 对括号组成的合法括号序方案数乘 2(因为要考虑是 A 走在前还是 B 走在前)。这是经典的卡特兰数模型,故 (x,i)(x,y) 不相遇地游走的方案数为 2×Catalan(|yi|1)

具体地:

w1(x,y)=c1(x,y)i=1y12×Catalan(yi1)c1(x,i)w2(x,y)=c2(x,y)i=y+1m2×Catalan(iy1)c2(x,i)

直接算是 O(n3) 的。

code ARC124F - O(n3)

很可惜,这个方法并不高妙。如果有大佬把上面的式子推出来了请教教我。

首先需要指出先前几个非常蠢的设定。

首先,下标从 1 开始做简直是愚蠢,一堆加减 1 叠在一起稍有不慎就会写错。

以下定义下标从 0 开始,并且对应地将 n,m 减一。

其次,没有必要分设 w1,w2 以及 c1,c2:很显然,w2(x,y)=w1(x,my),c2(x,y)=c1(x,my)

以下定义 w,c 分别表示上文的 w1,c1。有

q(x,y)=w(x,y)×w(x,my)ans=0xn0ymq(x,y)

再次,之前的 c 从组合意义上和写法上都太恶心了。

之前的计算方式是:分别计算 A,B(x,y) 的方案数,再把 Ax+y 步和 Bnx+y 步进行组合。

然而 A 的两个方向和 B 的两个方向共 4​ 个类别的元素是独立且平等的,直接把它们组合起来比分组组合再组合更优。这不仅体现在空间占用上,推式子的过程也会有巨大改观。(如果按照之前的算法写成多项式系数,你看看是不是要复杂地多?)

c(x,y)=(n+2yx,y,nx,y)

同时为了方便表述,称相遇的位置为关键点。

Idea 1

参考 这篇题解 的思路。

形式上,对 w(x,y) 给出 递推式 而不是直接计算;容斥策略上,考虑当行第一个关键点,而不是最近关键点:

w(x,y)=c(x,y)i=1y1w(x,i)(2y2iyi)

Idea 2

参考 这篇题解 的思路。

从另一个角度来观察我走向 Dead End 的原因,大概是没有 尽早进行容斥。如果直接对答案进行容斥,以下可见过程会明亮很多。

W1 表示至少有一个关键点的方案数,W2 表示至少有 2 个关键点的方案数:

ans=W1W2

考虑一个要让一条路径只被贡献一次,此处进行了一步大胆的转化:一条路径的贡献拆成 路径上关键点数 路径上相邻关键点对数

前者枚举关键点位置,后者枚举相邻关键点对,对二者分别统计总数量,记作 s1,s2

前者正是我们最初想到的错误式子!此时体现了它的真正意义。我们还没有尝试过对其进行推导:

s1=0xn0ymc(x,y)×c(x,my)=0xn0ym(n+2yx,nx,y,y)(n+2m2yx,nx,my,my)=0xn0ym(n+2yy)(n+yy)(nx)(n+2m2ymy)(n+mymy)(nx)=0ym(n+2yy)(n+yy)(n+2m2ymy)(n+mymy)0xn(nx)2=(2nn)0ym(n+2yy)(n+yy)(n+2(my)my)(n+(my)my)

fm=0ym(n+2yy)(n+yy)(n+2(my)my)(n+(my)my)。这玩意儿可以卷积求!

接下来算 s2

s2=0xn0l<ml<rmc(x,l)×c(x,mr)×2×Catalan(rl1)=0xn0len<m2×Catalan(mlen1)0ylenc(x,y)×c(x,leny)=(2nn)0len<m2×Catalan(mlen1)×flen

简单解释:由于是枚举相邻点对,因此还要乘上卡特兰数(前文有叙述)。

很妙的一步转化是,把 l,r(枚举的两个相邻点纵坐标)左右的部分拼起来,又可以看成 yc(x,y)×c(leny) 的形式,其中 len 进行枚举去掉 lr 后的剩余长度。

类似地处理 W2:又记 s3 表示所有路径的相邻三个关键点组的数量,则 W2=s2s3

s3 可以考虑先枚举三元组的左右两个关键点,这和 s2 很像,唯一不同的是要枚举中间点的位置,影响到卡特兰数的贡献。

gm=0ym2Catalan(y)×2Catalan(my),则:

s3=(2nn)0len<mgmlen1×flen

g 也用卷积求出来,这下 s3 也搞定了。

那么就做完了!

本文作者:Schucking-Sattin

本文链接:https://www.cnblogs.com/Schucking-Sattin/p/17860600.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Schucking_Sattin  阅读(22)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起