ABC346
E题
这题是春季测试涂色游戏的进阶版本,这个题的正确做法是”时光倒流“,因为是覆盖问题,所有从后面做倒着向前走,可能会更好
但是这个题,我有一个做法是\(o(nlogn)\)的,我们先来考虑列,将列排序,按照时间来排序,对于每一行来说,每一列的染色时间都确定好了,我们可以二分
为什么思考是二分?
因为数据范围是\(2*10^5\),所以时间复杂度为\(o(logn)\),非常合理,但是这个也限制了思考,根本没有往\(o(n)\)的方向思考
如何二分呢?
我们先来考虑列,将列排序,按照时间来排序,对于每一行来说,每一列的染色时间都确定好了,我们可以二分找到小于等于t(行的时间)的个数,然后将这个个数的染色都变成行的颜色,这个地方是能考虑到的
和正解差在哪里?
差就差在大于t的那些列,但是我就觉得应该一个一个的枚举过去,但其实不用,我们使用差分就可以了,我们记录\(cf[i]\)表示i之后的行都被记录一次,这样我们能得到一个差分前缀和,这就是这个列被记录了多少次,最后我们统计颜色的时候,把这个个数加到相应的颜色即可
总结
没想到差分还能这么用,一直以为,差分就是给出了具体的区间,但其实这个差分的使用更加突出了差分的意义,就是不美剧,只记录,所以差分的使用还是不数量
题目部分分设置
所以这个题可以改编,\(o(nlogn)\)的做法可以做到60分,正确的做法是\(o(n),这个可以100\)