题意
- 给出一个有 N N N 个点的环,环上各点有一个初始权值 a i a_i ai,给出 Q Q Q个询问,每次询问给出一个区间 [ l , r ] [l,r] [l,r] 和一个值 A A A ,对于 A A A 的变动定义如下( r r r 可能会小于 l l l 因为是环形)。
for (int i = l; i <= r; i++) if(a[i] > A) swap(a[i], A);
- 对于每个询问,回答遍历完区间 [ l , r ] [l,r] [l,r] 后 A A A 的最终值。
这个东西没有什么比较好的数据结构可以处理,那么就考虑分块,对于每个整块一个数经过的时候只会改变它的最大值,那么我们对于每个整块用一个大根堆来维护其最大值,边角块的话我们可以暴力重构这个块,区间内经过的值可以用一个小根堆来维护。
因为新的值肯定来自原集合与经过的值,那么每次把经过的值从小到大替换掉大于它的第一个即可,再把新的块构建出来就可以了,这样复杂度是 O ( n n l o g n ) O(n\sqrt{n}logn) O(nn</