1.9模拟赛题解

T1

从左到右扫描,首先如果 \(a_i<b_i\) 那么一定无解,否则不断在其右边找最近的 \(j\) 使得 \(a_j\in[b_i,a_i]\),把 \(a_i\)\(a_j\) 交换。感性理解这是对的。

T2

先证操作次数不大于 \(2\)。考虑第一次把所有 \(i>j\) 的边删除,第二次把 \(i<j\) 的边删除,易知这样操作符合要求。

因此只要能买到一个环,答案即为 \(2\);否则为 \(1\)。问题转化为求最小环。

考虑把每个点拆成出点和入点,自己的入点向自己的出点连边,对于原图中的边 \(i\rightarrow j\),在新图中从 \(i\) 的出点向 \(j\) 的入点连边。跑 \(n\) 遍 Dijkstra 即可。

T3

直接在最短路图上爆搜。由于 \(n\) 只有 \(50\),因此时间复杂度的上界大约为 \(O(3^{\frac{50}{3}})\),这是能过的。

T4

容易发现 \(c_i=a_i+b_i+[a_j+b_j\ge10]\),其中 \(j\)\(i\) 右边最近的满足 \(a_j+b_j\not=9\) 的位置。

一次修改发生时,如果第 \(i\) 位从进位变成不进位,或者从不进位变成进位,那么影响会一直持续到 \(i\) 左边最近的满足 \(a_j+b_j\not=9\) 的位置。

所以用一个数据结构维护所有 \(a_i+b_i\not=9\) 的位置,需要支持插入、删除、查询前驱和后继。考虑使用 set,时间复杂度 \(O(n\log n)\)

警钟敲烂:对 set 直接使用 algorithm 库的 lower_bound 的时间复杂度为 \(O(n)\),需要使用 set 自带的 lower_bound!

posted @ 2023-01-12 14:58  Egg_eating_master  阅读(33)  评论(0)    收藏  举报