atcoder(2022.7~2022.11)

AGC 001 D

题目大意:有一个长度为 m 的序列 a,它的和为 n,需要将 a 重排,并构造一个任意长度但和为 n 的序列 b,使得对任意长度为 n 的字符串,如果它能被 a 划分成一堆长度为 ai 的回文串,且能被 b 划分成一堆长度为 bi 的回文串,那么它的所有字符一定相同。

转化为图论问题,相当于是要使 n 个点的图连通。

如果 ai 的奇数个数大于 2 无解。

把长度为偶数的 ai 放中间,长度为奇数的 ai 放两边。

端点处的 ai 伸出一个接口。

中间的 ai 伸出两个接口。

AGC 001 E

考虑组合意义。

相当于是求从 (0,0) 走到 (ai+aj,bi+bj) 的方案数。

考虑平移一下,求从 (ai,bi)(aj,bj) 的方案数。

然后设 dp(i,j) 表示走到坐标 (i,j) 的方案数。

dp(i,j)=dp(i1,j)+dp(i,j1)

刚开始把所有 i 对应的 dp(ai,bi)1,最后还要减去 (ai,bi)(ai,bi) 的贡献再除以 2即可。

AGC 001 F

没见过的套路。

考虑 Qi 表示元素 i 在原排列 P 中出现的位置。

那么原来的条件可以转化为,当 |QiQj|K|ij|=1 时可以交换 QiQj

因此,当 |QiQj|<K 时,如果 i<j,无论怎么调整,总有 i<j

也就是说,当 |ij|<K 时,如果 Pi<Pj,无论怎么调整,总有 Pi<Pj

因此,可以根据初始时 Pi 的大小关系建立 DAG,使得字典序最小。

暴力拓扑排序的话可以把点放到一个小根堆里,每次取出编号最小的删除。

可以考虑使用线段树优化这一过程,一个点 x 入度为 0 仅当它在 (xK,x+K) 中值最小。

每次从小根堆中取出元素后把这个点删去,再分别查询 (xK,x)(x,x+K) 中最小的点,检验一下是否入度为 0 即可。

AGC 002 D

题目大意:有一张连通图,第 i 条边的边权为 i,每次询问给定 (x,y,k) 询问从 xy 走出来的点集满足大小等于 k 时最大边的最小值是多少。

方法一:

可以离线,因此可以直接使用整体二分,答案用可撤销的按秩合并并查集维护,可以做到 O(nlogn)

方法二:

可以考虑建出 kruskal 重构树,每次询问二分一个答案,倍增往上跳,维护子树内的最大点权,时间复杂度 O(nlog2n)

AGC 002 E

用画图法解决博弈论。

考虑把 a 从大到小排序。

然后把数列 a 看成一个阶梯状的网格。

操作 1 相当于删除最左的一列网格。

操作 2 相当于删除最下的一行网格。

因此可以看成在网格上移动。

网格突出的地方满足 ai>ai+1,为必败点。

于是可以 dp 求出网格上所有点的状态。

直接 dpO(n2),无法通过本题。

观察一下状态的取值可以发现,一条斜线上的 dp 值相等。

因此可以从 (1,1) 出发,找到 (1,1) 所在斜线在网格内的最远点。

考察一下那个点与初始必败点间的位置关系即可。

AGC 002 F

终于懂了。

考虑一种颜色一种颜色地加,那么任意时刻白点的个数都大于等于颜色的种类数。

考虑给其它颜色编号,编号为 i 的颜色对应第 i 个白点,即编号为 i 的颜色一定是从左到右第 i 种出现的颜色。

这样,在我们加颜色的过程中,相当于是在给颜色编号,可以做到不重不漏。

f(i,j) 表示加入了 i 个白点,j 种颜色的方案数。

f(i,j)=f(i1,j)+f(i,j1)(nki(j1)(k1)1k2)(nj+1)

AGC 003 D

首先,只需要考虑 maxv 的质因子,一个数如果含有 >maxv 的质因子,它肯定可以选。

其次,每个数分解质因数后的指数都可以模 3

每个数都这样处理,会得到一个新的数列,满足新的数列中的数有唯一对应的不能同时选入集合中的值,这个值可能和它不等,可能和它相等。不等的话取个 max,相等的话只能选一个。

这样做的复杂度是 O(nmaxvlogmaxv),其中 maxvlogmaxv104 左右,无法通过本题。

考虑把分解所用的质因子调少,只考虑 maxv3 的质因子。

假设分解过后还剩的数为 x

如果 x=1,那么没有影响,正常处理。

如果 x>1,那么只可能是 ppqp23 种情况,其中 pq 都是质数。

如果是 p,那么它要匹配的数需要乘上 p2

如果是 pq,那么它要匹配的数需要乘上 p2q2

如果是 p2,那么它要匹配的数需要乘上 p

因此,判断一下 x 是不是完全平方数分类讨论一下即可,时间复杂度为 O(nmaxv3logmaxv)

这道题提示我们根号分治不一定只是二次根号,还可能是多次根号。

AGC 030 D

一般的题目都是通过方案数求得概率,这道题说明还可用概率求方案数。

观察到每次交换只会影响 O(n) 个点对间的概率,但被影响方案数的点对较多,因此可以从概率的角度入手。

f(i,j) 表示 ai<aj 的概率,每次转移为 O(n),因此总复杂度为 O(nq)

AGC 041 D

第三个限制较难,先考虑第三个限制。

对于一个大小为 k 的子集 S 和一个大小为 k+1 的子集 T,需要满足第三个限制,相当于使得 S 集合的最大值小于 T 集合的最小值。

于是贪心地构造,排序后把前 k+1 个数放到 T 集合,后 k 个数放到 S 集合,那么第三个限制等价于前 n2+1 个数的和大于后 n2 个数的和。

再考虑第一个限制,这相当于每次选择一段前缀减 1

于是可以预处理出每段前缀减 1 后对前 n2+1 个数和后 n2 个数的差的影响,跑一个完全背包即可。

ARC 104 D(背包DP,平均数)

题意

N 种数 1N,每种数可以选择 0K 个。

需要对每个 x=1,2,3,n,求出选择一些数,和的平均数为 x 的方案数,对 M 取模。

1N,K100108M109+9

题解

发现平均数不好处理。

假设选出的集合为 S,那么需要满足 vSv=|S|x

把每个 v 减去 xvSvx=0

这相当于是从 1x1 中选一些数,从 1nx 中选一些数,使它们的和相等的方案数。

f(i,j) 表示前 i 种数和为 j 的方案数。

使用多重背包的前缀和优化可以做到 O(n3k)

ARC 104 E(搜索,DP)

题意

n(1n6) 个数,每个数的范围为 1ai(1ai109),求所有填数方式中最长上升子序列的长度和。

109+7 取模。

题解

n 很小,于是可以先搜出所有可能的相对大小关系。

对于一种确定的相对大小关系,考虑 DP。

将所有的上界从小到大排序后可以发现,每种数一定只会出现在某两个相邻的上界之间。

f(i,j) 考虑了前 i 种上界,放了前 j 种数的方案数。

转移考虑新的上界之间放几个数,判断一下合不合法即可。

ARC 105 D(博弈论,结论)

题意

n(1n105) 个背包,n 个盘子,背包 i 里有 ai(1ai109) 个硬币,初始时盘子里没有硬币。

两个人轮流操作,如果还有背包有硬币,那么可以选择一个背包,把全部硬币导入某个盘子中,如果没有背包有硬币,那么可以选择一个盘子,至少取走一个硬币,最后不能操作的人输。

题解

简单题结论题,虽然我还是没有做出来。

首先当背包里的硬币全部转移到盘子上的时候,就是一个简单的 Nim 游戏,如果异或和大于 0,先手必胜,否则后手必胜。

如果 n 是奇数,Nim 游戏的时候后手先取,由于无论先手怎么放硬币,后手总能使一个盘子的硬币总数大于一半,因此后手必胜。

如果 n 是偶数,与奇数的情况类似,只是要特判所有数字出现次数都是偶数的情况。

ARC 105 E(博弈论,结论)

题意

有一张 n 个点 m 条边的无向图,两个人轮流操作,每次操作后需要满足下面两个条件:

  1. 节点 1 和节点 n 不连通。
  2. 没有重边和自环。

谁不能操作就输了,问谁能赢。

题解

假设最后 1 所在连通块的大小为 x,那么能够连的边数为 n(n1)2x(nx)m

首先,如果 n 是奇数,那么这个公式的奇偶性固定,可以直接得到答案。

现在考虑 n 是偶数的情况。

假设 1 所在的连通块大小为 an 所在的连通块的大小为 b

如果 ab 的奇偶性相同,那么除去 1n 必然剩余偶数个点。如果 n(n1)2abm 为偶数,无论先手怎么操作,后手总能消除他的影响,因此后手必胜。否则,n(n1)2abm 为奇数,那么先手必然可以通过一次操作调整奇偶性,然后效仿之前后手的操作即可必胜。

如果 ab 的奇偶性不同,那么必然存在一个除去 1n 的连通块大小为奇数,因此,先手总可以调整使得这个式子为偶数且 ab 的奇偶性相同,转化为上面一种情况可以得出先手必胜。

ARC 105 F(状压DP,容斥)

题意

有一张 n 个点 m 条边的简单无向图,问选出一个边集,使得 n 个点与这些边构成的图连通,并且图是二分图的方案数。

998244353 取模。

1n17,n1mn(n1)2

题解

注意到连通图这个限制不好处理,于是可以考虑容斥。

g(S) 表示给集合 S 染色,不保证连通的方案数,f(S) 表示给集合 S 染色,保证连通的方案数,e(S) 表示集合 S 内部的边数。

g(S)=TS2e(S)e(T)e(ST)

求解 f(S),可以考虑用总的方案数减去不连通的方案数,通过枚举 S 中的一个连通块转移。

为了防止算重,可以钦定 S 中的任意一个元素 x 在选择的连通块中。

f(S)=TS,xTf(T)g(ST)

ARC 106 E(二分,Hall 定理)

题意

你经营着有 N 个员工的商店,每个员工会工作 ai 天然后休息 ai 天。

每一天你可以选择一个员工给他一枚奖章,问要使得每个员工都有 K 枚奖章最少需要多少天。

题解

首先,可以二分答案,问题转化为能否在 x 天内给每个人 K 个奖章。

这可以抽象成二分图匹配:左边有 NK 个点,右边有 x 个点,左边的点与右边的点有连边表示能够在那一天给那个人一枚奖章。

现在需要判断这张二分图是否存在最大匹配。

注意到只需要判断是否存在最大匹配,并不需要求出具体的最大匹配是多少,于是可以考虑 Hall 定理:对于任意一个左部点的集合 S 假设它能连到的右部点的集合为 e(S),满足 |S||e(S)|

有一个结论是,我们并不需要枚举 2NK 个集合,只需要枚举 2N 个集合,并钦定集合中一定包含了每个人的那 K 个点。

这是因为我们只需要找到那些最不可能满足条件的集合就行了,而对于固定的人的集合 S|S||e(S)| 取得最大值是在每个人都选满 K 天的时候(天数越大越容易超过 x)。

所以,只需要二分答案后枚举 2N 个集合判断即可。

ARC 106 F(计数,prufer序列,生成函数)

题意

N 个点,每个点有 ai 个孔,每次可以选择两个不同点,连接两个未被连接过的孔,有多少中方案使得最后形成一棵树。

题解

考虑 prufer 序列,假设第 i 个点的度数为 degi,那么答案为

(N2)!i=1Naidegi_(degi1)!

考虑生成函数

fi(x)=j=0aij+1_j!xj=j=0ai!j!(aij1)!xj=aij=0(ai1j)xj=ai(x+1)ai1

那么答案为

(N2)![xN2]i=1Nfi(x)=([xN2](x+1)(ai1))(N2)!ai

((ai1)N2)(N2)!ai

ARC 107 D(背包DP)

题意

选择 n 个数,每个数只能是 12i(i0),使得它们的和为 k 的方案数。

题解

fi,j 表示考虑了前 i 个数,和为 j 的方案数。

分两种情况:

  • 1,从 fi1,j1 转移。
  • 不选 1,从 fi,2j 转移。

i<jfi,j=0

AGC 030 F(DP)

首先,如果 ii+1 都不是 1,那么可以直接配对。

于是现在只有两个 1 或一个 1 的情况。

先不考虑两个 1 之间的排列顺序,最后乘上一个阶乘即可。

现在问题转化成给一大一小的数配对的方案数。

vali 表示 i 是否在序列中出现。

按照从大到小DP,设 fi,j,k 表示考虑了大于等于 i 的数,有 jval=0 的未匹配的数,kval=1 的未匹配的数,能够得到的数列个数(不考虑两个 1 间的相对顺序)。

时间复杂度 O(n3)

AGC 013 D(DP)

小粉兔的题解

AGC 036 D(差分约束,负环,DP)

不存在负环等价于差分约束存在一组解。

考虑差分约束的变量 xi,因为 ii+1 连的边权为 0 的边不会删去,因此满足 xixi+10

pi=xixi+1,需要满足 pi0,再令 sipi 的前缀和。

如果 ij 连了一条边权为 1 的边,那么 xixj1,即 sj1si11

如果 ji 连了一条边权为 1,的边,那么 xixj1,即 sj1si11

可以发现 pi 的取值只能是 0,1

现在问题转化为有 n1 个取值为 0,1 的变量,如果一个连续段的和大于 1 会付出一定代价,如果小于 1 会付出一定代价,求最小代价。

考虑 DP,设 fi,j 表示最后一个 1 的位置为 i,倒数第二个值为 j,只考虑右端点小于等于 i 的连续段的最小代价。

使用二维前缀和优化即可做到 O(n3)

AGC 040 E(DP)

将序列分成两个序列相加的形式,令 ai=bi+ci,于是答案等于 [bi>bi+1]+[ci<ci+1]

fi,j 表示前 i 个数,bi=j 的最小代价。

fi,j=mink=0ai1(fi1,k+[j<k]+[j<k+aiai1])

可以发现对于同一个 i,一定有 fi,0fi,ai+2,而对于同一种取值的 fi,jj 肯定越小越好。

于是只需要对每个 i,维护 3j 即可,时间复杂度 O(n)

AGC 032 E(结论,调整法,二分答案)

结论是一定存在一个分界点,满足左边首尾匹配后小于 M,右边首尾匹配后大于等于 M,可以通过调整法证明。

于是二分答案即可。

小粉兔的题解

AGC 010 E(拓扑排序)

先考虑 a 固定的下最终的序列是什么。

如果存在 i<j,满足 aiaj 不互质,那么 aiaj 的相对顺序已经固定,可以根据这个建出一张 DAG。

而后手要使得字典序最大,用大根堆维护拓扑序即可。

下面考虑先手的策略。

先手要使得字典序尽可能小,于是可以从小到大枚举权值 au,枚举所有与它不互质的数 av,如果 v 没有访问过,那么 uv,然后访问 v,递归下去。

对建出的图求一个最大拓扑序即可。

AGC 027 E(结论,贪心,DP)

参考 小粉兔的题解

首先,有个经典套路,将字符串中的 a 看成 1b 看成 2,那么每次操作后模 3 意义下的和不会改变。

然后,有一个结论,对于一个固定的字符串 ss 能够变成字符 c 当且仅当 |s|=1s 存在相邻的两个字符相同且 s3 意义下的和与 c 相等。

根据这个结论,我们可贪心地判断 s 是否能够变成 t

对于 t 的每个字符,找到 s 极短的一段前缀能够替换成那个字符,且必须满足最后 s 的字符在模 3 意义下和为 0

先特判掉没有相邻字符相等的情况,然后考虑对这个贪心的过程DP。

fi 表示以 i 开始的后缀能够变成的 t 的个数,为了方便,转移时可以加入一个空串,最后再减去即可。

时间复杂度 O(n)

AGC 017 F(轮廓线DP)

很妙的轮廓线DP。

先把一条折线用一个 01 序列表示,01 分别表示往左还是往右,然后不难想到一个暴力的状压DP,设 f(i,S) 表示考虑了前 i 条折线,其中第 i 条折线的状态为 S 的方案数,时间复杂度是 O(m4n)

考虑轮廓线DP。

f(i,j,S,d) 表示前 i 条折线,第 j 行,轮廓线状态为 S,第 j 行上第 i 条折线与第 i1 条折线的距离为 d 的方案数,时间复杂度为 O(mn22n)

考虑继续优化。

可以发现当前状态如果合法,如果这一位没有限制,那么这条折线可以往左走,如果有,那么可以往右走,问题在于没有限制但却往右走的情况很麻烦。

可以考虑设 f(i,j,S) 表示前 i 条折线,第 j 行,轮廓线状态为 S 的方案数。其中 S0j1 位表示当前折线的状态,而后面那些位表示限制,如果为 0 表示可以填 0/1,如果为 1 表示只能填 1(类似数位DP)。

考虑转移。

  • j 位为 1,只能向右走,fi,j1,Sfi,j,S

  • j 位为 0,可以往左也可以往右,如果往左,之后的限制并不会被影响,fi,j1,Sfi,j,S

    如果往右,会改变之后的限制,因为先在可以不管限制往左一次,也就是说,可以去掉 j 位之后的第一个 1,令 0j1 位构成的集合为 Tj 位以及之后构成的集合为 U,那么 fi,j1,Sfi,j,Tj(Ulowbit(U))(不严谨,看代码)。

ABC 276 G(组合数学,差分)

题目要求相邻两个数模 3 不同余,这个限制不好处理,考虑差分。

假设差分后的序列为 di=aiai1,那么需要满足如下限制:

  • di0

  • 如果 i2di3 只能是 12

  • dim

假设 di=3yi+xi,那么 yimxi3=t,方案数为 (t+nn)

AGC 012 D(组合数学,结论)

如果 a 能和 b 交换,且 a 能和 c 交换,那么 a,b,c 的顺序可以任意排列,因此,相对顺序可以改变的性质具有传递性。

于是可以轻易得到一个 O(n2) 的做法,枚举所有点对 (i,j),如果 ij 能交换那么就把它们合并到一个连通块,最后的答案就是所有连通块答案的积。

再思考一步可以发现,连边只和每种颜色权值最小的点有关,分类讨论一下即可。

AGC 018 F(欧拉回路,构造)

对于一个节点 u,如果在两个树上儿子个数的奇偶性不同,那么一定无解。

考虑建出一张有 2n 个节点的图,其中 1n 号节点表示第一棵树,n+12n 号节点表示第二棵树,它们均保留原来树上的边,特别的,两个根之间连一条双向边。

此时,对于 1in,如果 i 号点的度数为奇数,那么 ii+n 之间连一条双向边。

这样,所有点的度数都是偶数,存在欧拉回路。

跑一遍欧拉回路,考虑之前新增的边的方向,如果是 ii+n,那么 i 的值为 1,否则为 1,对于没有新增边的点,值为 0

证明可以考虑欧拉回路中每个简单环的贡献。

AGC 035 D(DP,逆推法,搜索)

最后一定会剩下下标为 1n 的两个数。

考虑逆推,假设要在 ab 中间插入一个数 v,考虑 v 对答案的贡献。

a 将会被记入答案 x 次,b 将会被记入答案 y 次,那么 v 的贡献为 v(x+y)

于是考虑设 f(l,r,x,y) 表示当前剩下的两个数的下标为 lrl 将会记入答案 x 次,r 将会记入答案 y 次的最小和。

转移考虑枚举新加的数的位置

f(l,r,x,y)=minl<i<rf(l,i,x,x+y)+f(i,r,x+y,y)+ai(x+y)

最后的答案为 a1+an+f(1,n,1,1)

这个算法的复杂度是多少呢?

可以发现,当 rl 相同时运算次数是完全相同的于是有一个大概的式子(不严谨,但可以这么分析):

T(n)=i<nT(i)

S(n)T(n) 的前缀和,那么

S(n)=2S(n1)

于是时间复杂度为 O(2n)

AGC 015 D(结论,分类讨论)

lr 从高到低第一个不同的二进制位为 pm = (l >> p << p) + (1ll << p)qp 以下,r 的二进制为 1 的最高位。

把区间分成两部分:[l,m)[m,r]

  • [l,m) 区间的数能够得到的数为 [l,m)
  • [m,r] 区间的数能够得到的数为 [m, (r >> p << p) + (1ll << (q + 1)) - 1]
  • 最后再考虑两个区间之间的影响,能够的得到的数为 [l | m, m | (m - 1)]

AGC 016 F(博弈论,状压DP)

小粉兔的题解

AGC 014 D(博弈论,结论,树)

首先,如果原图存在完美匹配,那么后手获胜。

如果不存在完美匹配,先手每次选择叶子的父亲,那么后手必然选择那个叶子,如果存在一个点,它的儿子是叶子的个数大于 1,那么先手可以获胜。

于是,先手可以每次都选择一个叶子的父亲删除,在它选择之后,后手的选法就确定了。

由于不存在完美匹配,因此到最后一定存在一个点,它的儿子是叶子的个数大于 1

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