AGC061C First Come First Serve

AGC061C First Come First Serve(2697)

洛谷:AGC061C First Come First Serve

Atcoder:AGC061C First Come First Serve

Problem

\(n\) 个人来过,第 \(i\) 个人在 \(a_i\) 时刻来在 \(b_i\) 时刻走,每个人可以在来时或走时登记,问可能的登记顺序有多少种。

\(n\leqslant 5\times 10^5\)\(a_i,b_i\) 互不相同,\(\forall i<n,a_i<a_{i+1},b_{i}<b_{i+1}\)

Solution

直接考虑最终的合法排列,然后不会做,然后问波特, 于是将最终的排列对应到每个人选择在左端点或者右端点登记的方案。

\(n\) 条线段按左端点从小到大排序。

01 数列 \(C\) 表示上述方案,\(C_i\)\(0\) 表示第 \(i\) 条线段选择左端点,否则选右端点。

为了使排列与 \(C\) 一一对应,我们需要考虑一种构造 \(C\) 的方式。

若存在 \(C1, C2\) 满足同一个排列,构造 \(C_i = \min(C1_i, C2_i)\)

即执行能取左端点就取左端点的策略。

关于正确性,\(\color{red}{\text{b}}\color{black}{\text{ottyl}}\) 给出了一种很好的理解方式:考虑 \(C1\)\(C2\) 第一个不同的位置 \(i\),由于之前的填法已经确定,在这里既能填 \(0\) 又能填 \(1\) 的话,说明之前选到的点均不在第 \(i\) 条线段的内部,之后选到的点也不在第 \(i\) 条线段的内部。将这个位置强行钦定为 \(0\),则第 \(i\) 条线段将不会决定性地影响之后的选取,即之后枚举的线段不管选左端点还是右端点,相对顺序都在第 \(i\) 条线段之后(注意线段按照左端点排序)。反之,如果第 \(i\) 条线段只能填 \(0\) 或只能 \(1\),它一定不会是我们强行钦定的结果,而是自然选择的结果。

重要思想是:强行钦定不能影响自然选择

考虑第一个不同 也是分析中重要的一点,从前往后推保证了转化的正确性。

所以问题转化为合法的 \(C\) 数列计数(经最小值构造后的)。

\(f_i\) 表示考虑前 \(i\) 条线段填 \(C\) 的方案数。

对于一个线段 \(x\),记 \(L_x\) 为与 \(x\) 相交的最左端线段,\(R_x\) 为与 \(x\) 相交的最右端线段。当 \(L_x\)\(x - 1\) 这些线段均选左端点,\(x + 1\)\(R_x\) 均选右端点时,\(x\) 既可以选左端点也可以选右端点,因此会被计重。去重方法是:在 \(R_x\) 的地方对 \(f_{R_x}\) 减去 \(f_{L_x - 1}\)

转移很简单,就是 \(f_i = 2 \times f_{i - 1}\)

code AGC061C First Come First Serve

posted @ 2023-03-03 10:06  Schucking_Sattin  阅读(64)  评论(1)    收藏  举报