题目大意:
给定一个长度为 n n n的序列和 m m m次操作,每次操作设 a n s ans ans为在 [ 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∗ans)/(r−l+1)
题解:
可以将操作分为两步:
1.求ans
2.更改数值
分块,块内有序,便于查询ans,更改后与左右进行交换,保证块内有序。
例如,读入完所有的数,用一个 b o l c k bolck bolck数组存下来,排序,就达到了块内有序的要求
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 getan