题意
一个序列,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 小。可持久化权值线段树搞定。