题目描述
a[1][i]<=1e4,n,m<=1e5
解题思路
一眼似乎不可做。随便搞个数据打个表找找规律,发现除了第一行,第i行和第i+2行是一样的。
考虑一种权值为一种颜色。
那么问题变成了询问一个点的前面有多少个和他一样的点记为cnt0,或者询问一个点之前,次数大于等于cnt0的其他颜色的个数cnt1。
考虑分块。
考虑维护前i个块内的每个颜色x的cnt0[x]和每个次数y的cnt1[y]。那么一个元素要插入O(根号)个块里。
一开始,我们可以先把cnt0[]用桶a搞出来。然后用另一个桶b,其中b[x]表示cnt0=x的颜色个数。然后求个后缀和,就把cnt1[]给做出来了。
考虑修改怎么做,发现每次修改某个cnt0-1,某个cnt0+1,观察到前缀和数组只会改变两位,那么修改就是O(根号)的。
考虑求答案。如果求x的cnt0,我们只需要把最大的前缀块拿出来,然后用他的cnt0[x]再加上不在块内的x的个数。
如果求cnt1,我们先求出cnt0,然后答案是,最大的前缀块的cnt1[cnt0],再加上,算上块外的数之后出现次数从小于cnt0变成大于等于cnt0的颜色个数.
时间复杂度O(n sqrt(n))
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<set>