AtCoder Beginner Contest 257(C~G)

AB 不写了

UPD: 更新了 G 的题解

ABC257C Robot Takahashi

按照 \(W_i\) 排个序,算一下前缀后缀 10 的个数就行了。答案大概是一个 \(\text{max}(p_i+s_{i+1})\) 的形式。

有一个小细节:排序之后 \(W_i=W_{i+1}\) 时无法在 \(i,i+1\) 之间断开,要特判。我因为这个 WA 了一发。

AC Code

ABC257D Jumping Takahashi 2

二分答案,然后暴力建图 dfs 就行了。\(O(n^2\log V)\)。注意二分的右端点不能太小也不能太大。我思考了一下感觉至少要开到 \(4\times 10^9\),然后无脑开了 \(10^{14}\) 结果一下子爆 long long 了,又 wa 了一发2333

AC Code

ABC257E Addition and Multiplication 2

我们发现如果确定了每个数 \(i\) 要买几个,那么最优方案肯定是从 \(9\)\(1\) 一个一个放下来。

因此考虑用一个长度为 \(9\)vector 来表示每一个数字选了多少个,然后随便 dp 一下就行了。

时间复杂度 \(O(n\times 9^2)\)。感觉看代码更好理解:AC Code

ABC257F Teleporter Setting

考虑新建一个假的点 \(S\),对每个 \((0,v)\) 的边连边 \((S,v)\)

现在相当于对每个 \(i\) 要算出来如果加上边 \((S,i)\) 之后 \(1\to n\) 的最短路。

这个是经典问题,直接正反跑两遍单源最短路算出来 \(f[i],g[i]\) 表示 \(1\to i,n\to i\) 的最短路,那么答案就是 \(f[n],f[S]+g[i],f[i]+g[S]\) 中的最小值。本题中边权都是 \(1\),直接 BFS 即可。复杂度 \(O(n+m)\)

AC Code

ABC257G Prefix Concatenation

考虑 dp:设 \(F(i)\) 为前缀 \(T[1\cdots i]\) 的答案,那么转移方程大概是 \(F(i)=\max\{F(j)+1|j<i,S[1\cdots i-j]=T[j+1\cdots i]\}\) 的一个形式。但是满足这个条件的 \(j\) 并不是一段区间,不好优化。

正着 dp 不好做,我们考虑倒过来:设 \(F(i)\) 为后缀 \(T[i\cdots n]\) 的答案,则 \(F(i)=\max \{F(j)+1|j>i,S[1\cdots j-i]=T[i\cdots j-1]\}\)

那么设 \(L_i\)\(T[i\cdots n]\)\(S\) 的 LCP 长度,\(j\) 就要满足 \(i<j\le i+L_i\),这样就变成单点修改区间求 min 了。线段树直接做,\(O(n\log n)\)

AC Code,跑的飞快,最慢 197ms。

后记

《五彩斑斓的世界》

posted @ 2022-06-25 21:57  云浅知处  阅读(580)  评论(2编辑  收藏  举报