跟着做一遍 (挽救一下可怜我的发文量)
考虑设 fi,j 表示到第 i 轮,是否有合法方案满足 a=ki 且 b=kj 。同样设 gi,j 表示到第 i 轮,是否有合法方案满足 b=ki 且 a=kj 。
将转移分成以下几种:
- ki 和 ki+1 的得主不同:
- fi,j→gi+1,i:必要条件是 b=ki+1,a=ki 在第 i+1 轮满足要求。
- gi,j→fi+1,i:必要条件是 a=ki+1,b=ki 在第 i+1 轮满足要求。
- ki 和 ki+1 的得主相同:
- fi,j→fi+1,j:必要条件是 a=ki+1,b=kj 在第 i+1 轮满足要求。
- gi,j→gi+1,j:必要条件是 b=ki+1,a=kj 在第 i+1 轮满足要求。
线段树维护 f,g 。第一种转移维护了线段树信息后看看能不能这么转移,然后再看看如果状态合法就插入线段树;第二种转移相当于先看看 ki+1 对应是否合法,然后满足必要条件的 kj 一定是一段连续的值域区间的,将其余部分直接清空即可。
时间复杂度 O(nlogn) 。
代码咕了。
0 条评论