题目
解题思路
本题实际求的是逆序对,树状数组维护的是小于 x x <script type="math/tex" id="MathJax-Element-17">x</script>的个数。然后累求图腾的个数。
代码
#include<cstdio>
using namespace std;
long long ans1,ans2; int n,x; long long a[200011];
int answer(int x)
{int ans=0; for(;x;x-=x&-x) ans+=a[x]; return ans;}
void add(int x,int y) {for(;x<=n;x+=x&-x) a[x]+=y;}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&x); long long k=answer(x-1);
ans1+=(long long)((i-k-1)*(n-i-x+1+k));
ans2+=(long long)(k*(x-1-k));
add(x,1);
}
printf("%lld %lld",ans1,ans2);
}