题解省流:做法同
喵仔牛奶等人。题解区最后几篇都是这个做法,但全部没有证明复杂度,同时讨论区也有人不理解为什么复杂度是对的。本篇题解意在补充复杂度证明,不会侧重于做法的复述,如果想知道这个做法的实现细节可以看那几篇题解。
证法省流:视
n,m 同阶,时间复杂度
O(nlogn),势能分析。其实不是很难证?
简单复述做法:先删去
ai=bi 的位置,从左到右贪心,如果当前位是
l 且
al=0,不妨设以当前位为左端点有
k 个不同的区间,分别为
[l,r1],[l,r2],⋯,[l,rk],我们的策略是选取
[l,r1] 进行区间取反(可以简单通过异或差分实现故不是复杂度瓶颈),并将剩余区间改为
[r1+1,r2],[r2+1,r3],⋯,[rk−1+1,rk],如果与已有的区间重复则只保留一个。
正确性不难证明:不妨把
[l,r1],[r1+1,r2],[r2+1,r3],⋯,[rk−1+1,rk] 每个区间的长度都缩成一,那么得到
[1,1],[2,2],⋯,[k,k],同时
[l,r1],[l,r2],⋯,[l,rk] 变成了
[1,1],[1,2],[1,3],⋯,[1,k],显然前面一组区间可以实现
k 个数任意取反,只需证明后面一组区间也可实现,这个用数学归纳法很好证明。
考虑复杂度证明:定义区间
[l,r] 的势能为
log2(r−l+2)。初始态势能是
O(nlogn) 量级的,而终点态势能
≥0。考虑每次修改前的第
i(i≥2) 个区间为
[l,ri],改后变为了
[ri−1+1,ri],作差得势能减少了
log2(1+ri−ri−1+1ri−1−l+1)。那么,对于两对相邻区间
[l,ri−1] 与
[l,ri],如果
ri−1−l+1≥ri−ri−1+1 那么势能至少减少一,因此对这样的区间对进行操作的次数不会超过势能的量级
O(nlogn);否则第
i 个区间长度至少为第
i−1 个区间长度的两倍:考虑有
ri−1−l<ri−ri−1,则
ri−l+1=(ri−ri−1)+(ri−1−l+1)≥2(ri−1−l+1)。对于相同的
l,由于区间长度每次会乘以二,这样的区间对不会超过
logn 个,那么由于
l∈[1,n],这样的区间对不会超过
nlogn 个,同样只会对这样的区间对操作
O(nlogn) 次,总时间复杂度
O(nlogn)。