AtCoder Beginner Contest 270 Solution

更好的阅读体验戳此进入

题面链接

题面 Luogu 链接

abc不说了(该说不说这一场前三题分类讨论是真麻

[ABC270D] Stones

题面

Takahashi 和 Aoki 在玩一个取石子的游戏。

刚开始,有 N 个石子,还有一个长度为 K 的序列 A={A1,A2,,AK}

现在,他们要按照以下规则轮流取石子:

现在,Takahashi 先取石子,Aoki 后取石子。 他们都想尽可能的最大化他们自己取走的石子数量。

若他们都以最优策略取石子,最后 Takahashi 会取走多少块石子?

Solution

开始以为是无脑贪心(主要是 D 题我以为会是很水那种

然后发现贪心是假的,就类似背包不能无脑装最大一样。所以考虑 DP,最开始想到 dp(i,j,0/1) 表示考虑前 i 个石子,考虑前 j 个序列 A 考虑先手还是后手,然后一直没调出来。后来发现直接去掉 j 这一维然后取个 max 就可以了。当然似乎直接去掉 0/1 这一维转移也是可以的。

Code

[ABC270E] Apple Baskets on Circle

题面

存在 n 个筐围成一圈,第 i 个有 Ai 个苹果。你需要从第 1 个筐开始依次拿掉一个苹果,直到拿了 k 个。如果筐内没有苹果那么直接拿下一个筐。求最终每个筐里还剩多少个苹果。

Solution

题解区怎么都是二分答案的做法,来一发 VP 时糊出来的更加无脑的模拟做法。

首先假设一圈里有 k 个篮子里有苹果,那么转一圈一定会拿走 k 个苹果,然后当拿空了一个篮子之后就会 kk1。所以我们考虑维护一下当前一共还有多少个篮子里有苹果,然后给所有 Ai 排个序,每次取最小的然后判断是否能拿空,如果可以的话那么直接拿空,否则尽量拿多圈,此时剩下的所有显然不足一圈,此时再次遍历一遍即可。

然后注意其中有一步 cur×v,这个东西我感觉似乎是 1024 级别的,于是开了个 __int128_t

Code

[ABC270F] Transportation

题面

n 个点,如下操作:

如果两个点 u,v 满足下列条件之一,则 u,v 可以互相到达:

问至少花多少代价才能让所有点连通 .

1n,m2×1051xi,yi,zi109 .

Solution

考虑新建两个点,对 n 个点连边,边权分别为 Xi,Yi,然后 22 次枚举并跑 MST 取最优即可。

Code

[ABC270G] Sequence in mod P

题面

对于某个无穷序列 {X},构造如下:

Xi={Si=0(A×Xi1+B)modPi1

求最小的 i 满足 Xi=G,没有输出 -1

多组数据,记 T 为数据组数,则有 1T100

保证 P 是质数,2P109

保证 0A,B,S,G<P

Solution

大概就是递推转通向,然后发现可以直接 BSGS 解决。

然后就是有一大堆特判的细节需要考虑一下。

Code

[ABC270Ex] add 1

题面

给定序列 An,存在 n 个初始为 0 的计数器,每次可以进行如下操作:选定一个计数器使其变为 0 并使得其它所有计数器 +1。求期望的使对于每个 i 满足第 i 个计数器的数值不小于 Ai 的操作次数。对 998244353 取模。

Solution

大概是一道没有什么高端的算法,仅靠推式子的难度评黑的题。

首先我们不难想到,如果设当前计数器的值为 Ci,那么我们的目的就是要满足所有 AiCi0

然后不太严谨地思考一下不难发现,我们每次是使除了选择的其它的计数器都加一,所以拖后腿的一定是 max{AiCi},令 k=max{AiCi} 则状态将仅与 k 相关。

于是此时不难想到一个较为简单的状态:令 F(k) 表示状态为 k 时的期望操作次数。

显然 F(0)=0,考虑转移,不难发现状态 k 肯定对应这一个或者一段 A,因为序列 A 是不降的,所以我们假设第一个对应的前一个为 Aidx,显然对于前 idx 个的操作都会使 kk1,对于 idx 之后的操作都会使当前的 k 变为新的 Ai,所以转移显然为:

F(k)=idxNF(k1)+1Ni=idx+1NF(Ai)+1

转化一下:

N×F(k)=idx×F(k1)+i=idx+1NF(Ai)+N
idx×F(k1)=N×F(k)i=idx+1NF(Ai)N
F(k1)=N×(F(k)1)i=idx+1NF(Ai)idx

现在不难发现即较小的都在左侧,较大的都在右侧,不过这个转移仍然不行,也就是我们是已知 F(0) 然后想要求 F(An),但是这个式子却是需要反过来转移的,所以需要优化。

考虑令 G(k) 表示从状态 0 转移到状态 k 的期望次数,所以显然有 G(k)+F(k)=F(An)。移个项然后带进去 F,显然有:

F(An)G(k)=idxN((F(An)G(k1))+1Ni=idx+1N(F(An)G(Ai))+1

显然 F(An) 抵消了,则:

G(k)=idxNG(k1)+1Ni=idx+1NG(Ai)1

类比一下之前的推出来:

G(k1)=N(G(k)+1)i=idx+1NG(Ai)idx

显然:G(An)=0,我们要求 G(0),符合转移。

不难发现对于固定的 k 一定对应着固定的 idx,也就是 Ni=idx+1NG(Ai)idx 可以认为是一个常数,令其为 C,若再令 B=Nidx,所以有 G(k1)=B×G(k)+C,属于较为简单的转移,考虑矩乘优化,构造矩阵的过程也是平凡的,得到:

(G(k)1)×(B0C1)=(G(k1),1)

对于 [Ai,Ai+1] 之间的部分的所有 k 显然 BC 是相同的,这一部分用矩阵快速幂优化一下即可,最后复杂度应为 O(23nlogAi)

Code

UPD

update-2023_01_27 初稿