Array Transformer(分块)
题目大意: 给定一个长度为 n n n 的序列和 m m m 次操作,每次操作设 a n s ans a n s 为在 [ l , r ] [l,r] [ l , r ] 中严格效益v的数的个数,将 a [ p ] a[p] a [ p ] 改为 ( k ∗ a n s ) / ( r − l + 1 ) (k*ans)/(r-l+1) ( k ∗ a n s ) / ( r − l + 1 ) 题解: 可以将操作分为两步: 1.求ans 2.更改数值 分块,块内有序,便于查询ans,更改后与左右进行交换,保证块内有序。 例如,读入完所有的数,用一个 b o l c k bolck b o l c k 数组存下来,排序,就达到了块内有序的要求 for ( int i = 1 ; i <= n ; i ++ ) { scanf ( "%d" , & b [ ( i - 1 ) / block + 1 ] [ ++ b [ ( i - 1 ) / block + 1 ] [ 0 ] ] ) ; a [ i ] = b [ ( i - 1 ) / block + 1 ] [ b [ ( i - 1 ) / block + 1 ] [ 0 ] ] ; } 其次,查询。 如果l,r在一个块内,直接查整个块;否则,把两边的残余块先查了,中间的完整的块就直接lower_bound即可。 int