首先,显然集合后与集合前学生的相对位置不变。
第二,可以找到一个位置,使得在这个位置左边的学生都往右跑,右边的都往左跑。(因为往左往右往左往右太沙雕了……)
假设我们把 a 数组 [l,r] 区间里的数放到了 b 数组里且其有序,并且已经知道了这个分界点和有 c 个学生是往右跑的。
那么这 c 个往右的学生的贡献应该是 c∑i=1K+i−1−bi。
拆开得 K+c−1∑i=Ki−c∑i=1bi。
显然前者就是一个等差数列。
类似的,我们把另一边拆得 r−l+1∑c+1bi−K+r−l∑i=K+ci。
如果我们知道了这个分界点,求出答案就很简单了,只需要使用主席树。
但是我们不知道啊!
考虑二分。
乍一看答案的单调性不明显,但是它只会分成两部分,而且分界点的变化是单调性的。
于是在主席树上二分即可。
代码:
1 |
|