题目内容
小红有一个长度为n的数组a,记f(l,r,x)为区间[l,r]内x的出现次数。
现在小红想知道有多少对i<j满足f(1,i,ai)>f(j,n,aj)。
树状数组
前置知识树状数组https://oi-wiki.org/ds/fenwick/
对于目前的i只需要利用map映射f(1,i,ai)的值就可以知道也就是mp[a[i]],怎么快速知道有多少个f(j,n,aj)小于mp[a[i]],用一个树状数组维护,就可以直接区间查找了.
具体做法
add(f(j,n,aj),1),1<=j<=n
枚举i然后add(f(i,n,ai),−1)ans+=query(1,f(i,n,ai)−1)
整体时间复杂度o(nlog2n)
代码如下
cpp