AtCoder Beginner Contest 257(C~G)
AB 不写了
UPD: 更新了 G 的题解
ABC257C Robot Takahashi
按照 \(W_i\) 排个序,算一下前缀后缀 1
和 0
的个数就行了。答案大概是一个 \(\text{max}(p_i+s_{i+1})\) 的形式。
有一个小细节:排序之后 \(W_i=W_{i+1}\) 时无法在 \(i,i+1\) 之间断开,要特判。我因为这个 WA 了一发。
ABC257D Jumping Takahashi 2
二分答案,然后暴力建图 dfs 就行了。\(O(n^2\log V)\)。注意二分的右端点不能太小也不能太大。我思考了一下感觉至少要开到 \(4\times 10^9\),然后无脑开了 \(10^{14}\) 结果一下子爆 long long
了,又 wa 了一发2333
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)\)。
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。
后记
《五彩斑斓的世界》