JOI 2020 Final 题解

翻译界最 速 传 说

T1 只不过是长的领带

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

T2 JJOOII 2

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

T3 集邮比赛 3

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

T4 奥运公交

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

T5 火灾

不错,我就是原题哥!

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

猜你喜欢

转载自blog.csdn.net/EI_Captain/article/details/104233990