AtCoder Beginner Contest 258 Solution

更好的阅读体验戳此进入

题面链接

题面 Luogu 链接

abcd 跳了

[ABC258E] Packing Potatoes

题面

给定序列 W,下标范围为 [0,n1]。存在一个长度为 10100 的土豆序列,循环节为 n,第 i 个土豆的重量为 W(i1)modn。现在你需要用箱子装土豆,每个箱子装满则停止,即土豆重量恰好大于等于 X 时则停止。Q 组询问求第 ki 个箱子装了多少个土豆。

Solution

一道细节不少的找规律题。

首先不难发现,对于这个箱子,当你确定了从哪里开始装后,其最远能装到的位置也就确定了。我们考虑如何确定这个东西,不难想到做个前缀和然后二分,找到对应点开始的最长能取的长度,细节较多,如需要注意若长度仅为一初值需要判断。因为可能转回去所以可以将序列复制一份然后在这上面跑即可。

此时仍需要注意 X 可能很大以至于横跨多段,此处需要记录。此时我们即有 nxt 数组表示从该点开始取完土豆之后下一次需要从哪开始取。不难发现每个点有且仅有一条出边,则一定会成环,我们找到从 1 开始多少步后进入环,以及环长和每个位置的元素,最后对于每个询问判断一下是否进入环,未进入则直接调用,进入了则模一下找对应位置。中间细节很多,这道题本身的难度也就在细节上了,具体可以看代码。

复杂度卡在预处理上,最终复杂度 O(nlogn)

Code

[ABC258F] Main Street

题面

你要在平面直角坐标系中行走,每一步可以上下左右四个方向任意移动 1,耗时 k 秒。特别地,存在若干条快速通道,若该步起点和终点均满足 x0(modB)y0(modB),则认为该步是在快速通道上进行,仅需耗时 1 秒。询问从 (Sx,Sy)(Gx,Gy) 最少需要多少秒。存在多组数据。

Solution

显然可以选择直接走,或者走到起点附近的某个快速通道即终点附近的某个快速通道,共有 4×4+1=17 中方案,枚举计算取一下最小值即可。

Code

[ABC258G] Triangle

题面

给你一个简单的无向图,其中有 N 个顶点。用一个 的 N×N 邻接矩阵 A 来表示。如果 Ai,j=1 ,则表示 ij 有边相连,如果 Ai,j=0 ,则表示 ij 无边相连。

求三角形 (i,j,k) 的个数,满足 1i<j<kn,且 ij 有边相连,ik 有边相连,jk 有边相连。

Solution

枚举 i,j,然后 k 可以通过 bitset 优化,最终复杂度 O(n3w)。记得需要把邻接矩阵重复部分去掉。

Code

[ABC258Ex] Odd Steps

题面

给定 n,S 和序列 An,求任意长度的满足以下条件的序列个数:

答案对 998244353 取模。

Solution

首先不考虑最后一个限制,则不难想到 DP,即设 dp(i) 表示和为 i 的合法序列个数,显然有转移:

dp(i)=dp(i1)+dp(i3)+dp(i5)+

然后发现转移为 O(S2) 无法通过,但显然可以通过前缀和优化,即:

dp(i)=sum(i1)
sum(i)=sum(i2)

边界为 dp(0)=1

然后复杂度是 O(S) 的,无法通过,但显然可以通过矩阵优化:

[dp(i1)sum(i2)sum(i3)][110001110]=[dp(i)sum(i1)sum(i2)]

 

矩阵快速幂优化即可。

然后对于第三个限制,我们只需要在维护的时候分段维护即可,每次维护到对应的 Ai,然后令该次 dp(Ai)=0,再接着转移下去即可。

最终复杂度 O(33nlogS)

Code

UPD

update-2022_12_17 初稿