JOI 2020 Final 题解

翻译界最 速 传 说

T1 只不过是长的领带

显然第 k k k 长的 A A A B B B 匹配是最优的,考虑将 A , B A, B A,B 排序,当 k ≤ i k \le i ki 时, B i B_i Bi A i + 1 A_{i+1} Ai+1 匹配,当 k > i k> i k>i 时, B i B_i Bi A i A_i Ai 匹配,因此我们用一个前缀最值一个后缀最值就可以拼出每个 k k k 的答案。
时间复杂度 Θ ( N log ⁡ N ) \Theta(N\log N) Θ(NlogN)
代码链接

T2 JJOOII 2

我们要找一个最短的子串使得串里包含 J k O k I k J^kO^kI^k JkOkIk 这一子序列,显然从任何一个位置可以贪心选取,因此我们考虑用一个队列,当队列里的元素超过 k k k 个就 pop,可以预处理出每个位置以其结尾至少要多长才能包含 J k , O k , I k J^k, O^k, I^k Jk,Ok,Ik,就能求算出每个位置以其结尾至少要多长才能包含整个。时间复杂度 Θ ( N ) \Theta(N) Θ(N)
代码链接

T3 集邮比赛 3

我们注意已经经过的区域是包含 0 0 0 位置的一个区间,故记 f ( l , r , k ) f(l, r, k) f(l,r,k) 为“当前已经经过的站是 l ∼ r l\sim r lr,其中成功集邮 k k k 张,现在站在 l l l 位置的可行最小时间”。这一状态可以 Θ ( 1 ) \Theta(1) Θ(1) 转移,答案即为不为 + ∞ +\infty + 的最大的 k k k,时间复杂度 Θ ( N 3 ) \Theta(N^3) Θ(N3)
代码链接

T4 奥运公交

注意到数据范围下有 M = O ( N 2 ) M = O(N^2) M=O(N2),我们跑最短路只需要使用 Θ ( N 2 ) \Theta(N^2) Θ(N2) 的贪心 dijkstra 即可。记四个最短路树 S s , S t , T s , T t S_s, S_t, T_s, T_t Ss,St,Ts,Tt 分别是从 s , t s, t s,t 出发,沿着 G G G 的最短路树和 G T G^{\mathsf T} GT 的最短路树,对于一条边 ( u , v ) (u, v) (u,v),我们先认为不把边考虑为反向,而是添加一条反向边,这样新的答案必然是让 1 ⇝ N 1\leadsto N 1N 的原最短路和 1 ⇝ v → u ⇝ N 1\leadsto v \rightarrow u \leadsto N 1vuN 的取较小值, N ⇝ 1 N \leadsto 1 N1 也类似。注意到如果 ( u , v ) (u, v) (u,v) 这条边不出现在这四个最短路树上,则新的方案必然不经过 ( u , v ) (u, v) (u,v),我们直接用于更新答案即可。而在某个最短路树上的边只有 O ( N ) O(N) O(N) 条,我们每个重新暴力建图跑一遍最短路即可。
时间复杂度 Θ ( N 3 + M ) \Theta(N^3 + M) Θ(N3+M)
代码链接

T5 火灾

不错,我就是原题哥!

注意 T T T 时间的 i i i 位置的值就是 [ i − T , i ] [i-T, i] [iT,i] 这一段的 max,我们要解决的就是等长区间的一段区间 max 之和。
考虑每个 i i i,将 S i S_i Si 取为最大值的所有区间 [ l , r ] [l, r] [l,r] l ∈ [ L i , i ] , r ∈ [ i , R i ] l\in [L_i, i], r\in[i, R_i] l[Li,i],r[i,Ri],通过笛卡尔树或者排序容易求得。在二维平面上即询问是一条斜率为 1 1 1 的线段,有 N N N 个矩形。考虑将所有坐标进行变换 y ← y − x y \leftarrow y-x yyx,我们的询问就是一条平行于 x x x 轴的直线,而矩形变成平行四边形。用 4 个树状数组,两个维护直线,两个维护斜线,即可在扫描线的过程中维护答案。
时间复杂度 Θ ( ( N + M ) log ⁡ N ) \Theta((N+M)\log N) Θ((N+M)logN)
代码链接

你可能感兴趣的:(题集/比赛题解)