JOIG 2022 题解

题目链接

A

直接计算。

B

直接枚举。

C

直接前缀和。

D

容易发现选择的九宫格重心一定只会在已有糖果的外围一圈(即与当前格子八连通的格子)。

unordered_map 即可。

代码链接:https://paste.ubuntu.com/p/GxstzCZMxC/

E

\(f_i\) 为到 \(i\) 且必选 \(i\) 的最大价值。

转移:\(f_i=\max\limits_{j<i\land a_j\not=a_i}\{f_j\}+a_i\)

维护一个区间 \(\max\) 线段树,下标是颜色。

用线段树维护 DP 即可。

时间复杂度 \(\mathcal{O}(n\log m)\)

代码链接:https://paste.ubuntu.com/p/9NprmfNjvs/

F

看到除法不好处理,于是逆向考虑问题。即从 \(t\) 出发到达 \(1\) 需要的最小代价。这时操作就变成了 \(+1\)\(\times2\)

先看链的情况,考虑每次在 \(i\) 后面加一个点 \(i+1\) 需要增加多少代价。可以发现代入之后就是从 \(i\) 出发代价已经为 \(2\) 的情况下到 \(1\) 需要的最小代价。

如何 \(\mathcal{O}(1)\) 转移这个代价?

思考一下可以发现,每一次 \(\times2\) 操作后从 \(i+1\) 出发的代价与从 \(i\) 出发的代价的差值都会 \(\times2\),即 \(\Delta=\Delta'\times2\),而 \(+1\) 操作差值不变。

于是我们可以得出:增加的代价是 \(i\) 之前 \(\times2\) 操作的次数即青色边条数。

因为 \(l\le10^9\),所以 \(\times2\) 操作次数不会超过 \(\log_2 l\le30\)

引入分层图的思想,设 \(dis_{i,j}\) 表示经过 \(i\)\(\times2\) 操作后到达点 \(j\) 的最小代价,Dijkstra 即可。

时间复杂度 \(\mathcal{O}(m\log m\log l)\)

代码链接:https://paste.ubuntu.com/p/zP2hNzGzMR/

posted @ 2022-02-02 16:15  csxsi  阅读(100)  评论(0编辑  收藏  举报