AtCoder Beginner Contest 257(C~G)

AB 不写了

UPD: 更新了 G 的题解

ABC257C Robot Takahashi

按照 Wi 排个序,算一下前缀后缀 10 的个数就行了。答案大概是一个 max(pi+si+1) 的形式。

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

AC Code

ABC257D Jumping Takahashi 2

二分答案,然后暴力建图 dfs 就行了。O(n2logV)。注意二分的右端点不能太小也不能太大。我思考了一下感觉至少要开到 4×109,然后无脑开了 1014 结果一下子爆 long long 了,又 wa 了一发2333

AC Code

ABC257E Addition and Multiplication 2

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

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

时间复杂度 O(n×92)。感觉看代码更好理解:AC Code

ABC257F Teleporter Setting

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

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

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

AC Code

ABC257G Prefix Concatenation

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

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

那么设 LiT[in]S 的 LCP 长度,j 就要满足 i<ji+Li,这样就变成单点修改区间求 min 了。线段树直接做,O(nlogn)

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

后记

《五彩斑斓的世界》

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