C. Text Editor
【题意】
有一篇文章,包含 \(i\) 行,每行有 \(a_i\) 个字母,也就是 \(a_i + 1\) 个放置光标的位置。对于一个位于 \((x,y)\) 光标,每次操作可以上移/下移/左移/右移。其中上移和下移比较特殊,如果移动到的那一行没有 \(y\) 个位置,那么会移动到该行最后一个位置。
\(n \le 100, a_i \le 10^5\)
【分析】
一共 \(10^7\) 个点,每个点最多连四条边,边权都为 \(1\),BFS 求最短路即可。卡空间,不要存图,BFS 的时候现场找边即可。
D. Table with Letters - 2
【题意】
给定一个 \(n \times m\) 的小写字母矩阵。求满足以下条件矩形的个数:
- 四个顶点字母一样。
- 矩形的 \(a\) 个数 \(\le k\)。
\(n, m \le 400\)
【分析】
首先暴力是 \(O(n^4)\),我们优化一个维度就差不多了。
考虑固定 \(x_1, x_2\)。然后具有可二分性,而且 \(a\) 的个数也很好记录,使用双指针即可优化一个维度。
E. Printer
【题意】
一台打印机每秒可以打印一页纸张。有 \(n\) 个打印任务,每个任务都有送达时间 \(t_i\),页数 \(s_i\) 和优先级 \(p_i\)。优先级之间互相不同。在任意一秒开始时,打印机会选择已经送达并且还没有打印完毕的任务中优先级最大的一个,并且打印该任务的一页。目前存在一个任务 \(x\),你不知道它的优先级,但是你知道该任务在第 \(T\) 时刻打印完毕,你也知道其他所有信息。求 \(x\) 的优先级和每个任务何时打印完毕。
\(1 \le n \le 50000, 0\le t_i \le 10^9, 1 \le s_i, p_i \le 10^9,1\le T\le 10^{15}\)
要求 \(1 \le p_x \le 10^9, p_x \neq p_i\)。
【分析】
首先,如果知道 \(p_x\),可以利用 set 在 \(O(n \log n)\) 时间内模拟完所有打印操作并且求出每个任务打印完毕的时间。
那么考虑如何计算 \(p_x\)。我们发现,如果 \(p_x\) 最高,那么它应该在第 \(s_x + t_x\) 时间被打印完。如果不是这样,那么一定是有其他比它优先级更高的在它打印的过程中间抢着打印完了。
考虑实际打印完的时间 \(T\) 和 \(s_x + t_x\) 的差值为 \(k\)。由于只有在 \(x\) 之前开始,但是在 \(x\) 任务开始的时候还没打印完的任务和在 \(x\) 之后,但在 \(x\) 任务结束前开始的任务才会影响打印 \(x\) 的进程。并且打印完 \(x\) 之前必然完整打印完所有优先级比 \(x\) 更高的任务。对于上述范围内的任务排序,并且从高到低遍历,打印完某个任务需要花费的时间加起来等于 \(k\) 的话,\(x\) 的优先级就恰好是在该任务的下面。
这样,总时间复杂度是 \(O(n \log n)\)。
需要注意的是,有些任务虽然不影响 \(x\) 任务的执行但是会妨碍 \(x\) 优先级的放置。因此预处理每一个优先级往下第一个可以放置的是多少。但是数据全是随机的,根本没考虑这一点,把直接 \(-1\) 的做法也放过去了。
还有一个做法比较简单,直接暴力二分 \(x\) 的优先级然后模拟,是 \(O(n \log^2 n)\) 的。
标签:10,le,优先级,154,打印,Codeforces,任务,Div.2,题意 From: https://www.cnblogs.com/Zeardoe/p/16940166.html