专栏文章

P11146

P11146题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minuy43f
此快照首次捕获于
2025/12/02 08:46
3 个月前
此快照最后确认于
2025/12/02 08:46
3 个月前
查看原文
题解省流:做法同喵仔牛奶等人。题解区最后几篇都是这个做法,但全部没有证明复杂度,同时讨论区也有人不理解为什么复杂度是对的。本篇题解意在补充复杂度证明,不会侧重于做法的复述,如果想知道这个做法的实现细节可以看那几篇题解。
证法省流:视 n,mn,m 同阶,时间复杂度 O(nlogn)\mathcal{O}(n \log n),势能分析。其实不是很难证?
简单复述做法:先删去 ai=bia_i=b_i 的位置,从左到右贪心,如果当前位是 llal=0a_l=0,不妨设以当前位为左端点有 kk 个不同的区间,分别为 [l,r1],[l,r2],,[l,rk][l,r_1],[l,r_2],\cdots,[l,r_k],我们的策略是选取 [l,r1][l,r_1] 进行区间取反(可以简单通过异或差分实现故不是复杂度瓶颈),并将剩余区间改为 [r1+1,r2],[r2+1,r3],,[rk1+1,rk][r_1+1,r_2],[r_2+1,r_3],\cdots,[r_{k-1}+1,r_k],如果与已有的区间重复则只保留一个。
正确性不难证明:不妨把 [l,r1],[r1+1,r2],[r2+1,r3],,[rk1+1,rk][l,r_1],[r_1+1,r_2],[r_2+1,r_3],\cdots,[r_{k-1}+1,r_k] 每个区间的长度都缩成一,那么得到 [1,1],[2,2],,[k,k][1,1],[2,2],\cdots,[k,k],同时 [l,r1],[l,r2],,[l,rk][l,r_1],[l,r_2],\cdots,[l,r_k] 变成了 [1,1],[1,2],[1,3],,[1,k][1,1],[1,2],[1,3],\cdots,[1,k],显然前面一组区间可以实现 kk 个数任意取反,只需证明后面一组区间也可实现,这个用数学归纳法很好证明。
考虑复杂度证明:定义区间 [l,r][l,r] 的势能为 log2(rl+2)\log_2(r-l+2)。初始态势能是 O(nlogn)\mathcal{O}(n \log n) 量级的,而终点态势能 0\ge 0。考虑每次修改前的第 i(i2)i( i \ge 2) 个区间为 [l,ri][l,r_i],改后变为了 [ri1+1,ri][r_{i-1}+1,r_i],作差得势能减少了 log2(1+ri1l+1riri1+1)\log_2(1+\frac{r_{i-1}-l+1}{r_i-r_{i-1}+1})。那么,对于两对相邻区间 [l,ri1][l,r_{i-1}][l,ri][l,r_i],如果 ri1l+1riri1+1r_{i-1}-l+1 \ge r_i-r_{i-1}+1 那么势能至少减少一,因此对这样的区间对进行操作的次数不会超过势能的量级 O(nlogn)\mathcal{O}(n \log n);否则第 ii 个区间长度至少为第 i1i-1 个区间长度的两倍:考虑有 ri1l<riri1r_{i-1}-l < r_i-r_{i-1},则 ril+1=(riri1)+(ri1l+1)2(ri1l+1)r_i-l+1=(r_i-r_{i-1})+(r_{i-1}-l+1) \ge 2(r_{i-1}-l+1)。对于相同的 ll,由于区间长度每次会乘以二,这样的区间对不会超过 logn\log n 个,那么由于 l[1,n]l \in [1,n],这样的区间对不会超过 nlognn \log n 个,同样只会对这样的区间对操作 O(nlogn)\mathcal{O}(n \log n) 次,总时间复杂度 O(nlogn)\mathcal{O}(n \log n)

评论

0 条评论,欢迎与作者交流。

正在加载评论...