题意

一个序列,Q 次询问一个区间 [l,r],进行 k 轮冒泡后,求子区间 [x,y] 的和。(N<=1e6,Q<=5e5)

冒泡定义为:

for i = 1 to n-1:
  if a[i] > a[i + 1]:
    swap(a[i], a[i + 1])

考场想法:

经典转 01。

11011100011100011111
 1011100011100011111+1
  011100011100011111+11
   01100011100011111+111
    0100011100011111+1111
     000011100011111+11111
      00001100011111+111111
       0000100011111+1111111
        000000011111+11111111
         00000001111+111111111
          0000000111+1111111111
           000000011+11111111111
            00000001+111111111111

考场上傻乎乎地考虑求后缀和然后差分,结果调不出来。

题解

被套路毁了!转牛魔 01!

19260817
 12608179
  12061789
   10216789
    01126789
     01126789
      01126789
       01126789

看前缀,其实就是 [l,l+x-1+k] 的前 x 小。可持久化权值线段树搞定。

posted on 2024-10-21 08:47  Zaunese  阅读(50)  评论(0编辑  收藏  举报