AtCoder Beginner Contest 320


\[\large \text{Round 10 : AtCoder Beginner Contest 320} \]

一言:
当毫无寄托的两颗心紧挨之时,真正的悲伤开始展翅翱翔。
——空之境界

终于在 ABC 搞过了揭老汉啦!

\(\text{F : Fuel Round Trip}\)

首先不难想到一个二维的 \(dp_{i,j}\),表示走到了第 \(i\) 个点,剩余油量为 \(j\) 需要花费的最少的钱。

但是由于每个加油站只能用一次,所以这样的话就有后效性。

发现 \(n,k\le 200\),考虑再来一个状态。

既然过去和回来加起来只能选一次,那就考虑把两者都统计,定义 \(dp_{i,j,k}\) 表示,正着走到 \(i\) 的剩余油量为 \(j\),到 \(i\) 点时的剩余油量为 \(k\),从 \(i\) 走到 \(n\) 的最小价钱之和。

显然,我们只需要枚举第 \(i\) 个点的油是不用,还是加给 \(j\),或者是加给 \(k\)。想到这里应该就比较直观了,为了方便,可以考虑顺推。

\(\text{Submission}\)

\(\text{G : Slot Strategy 2 (Hard)}\)

非常容易想到去枚举最终的那个数字,但是我却没有想到可以二分答案。

然后我们考虑去判断。

可以考虑建立一个二分图,左边节点为每一行,(右边节点为时间),连向满足条件的时间(即这个时间转到的是最终数字)。最后看他的最大匹配是否是 \(n\) 即可。

但是这个 \(t\) 可能会比较大,导致右边节点与左部节点连的边的数目太多了。仔细思考可以发现,如果左部节点连的边超过了 \(n\),那他显然是可行的,所以就不用去连更多的边了。故最终最多只有 \(n^2\) 条边。

所以最终复杂度 \(n^3\log{nm} \times 10\)

\(\text{Submission}\)

\(\text{What I learned:}\)

  • 当每个数有可能正着倒着被预选,但他又只能被选一次,且你只能动态规划时,考虑 \(1-n,i-n\) 的选数同时进行,定义 \(dp_{i,j,k}\) 同时维护进行到的 \(i\),以及正着和倒着的信息 \(j,k\),转移的时候看 \(i\) 是给了正着,倒着,还是都没给分别转移即可。

  • 有单调性的题目一定不要忘了二分啊!

  • 当一个点需要连很多边来实现自己的算法,但是你发现当一个点建立了一定量的边之后他的答案已经已知了,那么对于他之后的边就不要建了,不然容易让算法的时空复杂度假掉。

  • 如果对于每一个东西他需要选一个时刻保证其合法,而每个东西选的时刻必须不一样,要看最多有多少个东西合法(或者能不能够让所有东西合法)时,考虑二分图,或者在其他扩展情况下,可以考虑网络流。

posted @ 2024-03-04 15:21  Saltyfish6  阅读(6)  评论(0编辑  收藏  举报
Document