从左到右扫描,首先如果 \(a_i<b_i\) 那么一定无解,否则不断在其右边找最近的 \(j\) 使得 \(a_j\in[b_i,a_i]\),把 \(a_i\) 和 \(a_j\) 交换。感性理解这是对的。
先证操作次数不大于 \(2\)。考虑第一次把所有 \(i>j\) 的边删除,第二次把 \(i<j\) 的边删除,易知这样操作符合要求。
因此只要能买到一个环,答案即为 \(2\);否则为 \(1\)。问题转化为求最小环。
考虑把每个点拆成出点和入点,自己的入点向自己的出点连边,对于原图中的边 \(i\rightarrow j\),在新图中从 \(i\) 的出点向 \(j\) 的入点连边。跑 \(n\) 遍 Dijkstra 即可。
直接在最短路图上爆搜。由于 \(n\) 只有 \(50\),因此时间复杂度的上界大约为 \(O(3^{\frac{50}{3}})\),这是能过的。
容易发现 \(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!
标签:set,题解,复杂度,1.9,入点,模拟,进位,出点 From: https://www.cnblogs.com/Tarantula/p/1-9-p.html