题目
求三个纵坐标i,j,ki,j,ki,j,k可成为i<j>ki<j>ki<j>k或i>j<ki>j<ki>j<k的方案数
分析
这道题其实是求逆序对,用树状数组解决,维护小于xxx的值,然后正序枚举终点(v的最右边和/\的最右边)
代码
#include <cstdio>
long long ans1,ans2; int n,c[200001];
int in(){
int ans=0; char c=getchar();
while (c<48||c>57) c=getchar();
while (c>47&&c<58) ans=ans*10+c-48,c=getchar();
return ans;
}
void add(int x,int y){while (x<=n) c[x]+=y,x+=-x&x;}
int answer(int x){int ans=0; while (x) ans+=c[x],x-=-x&x; return ans;}
int main(){
n=in();
for (register int i=1;i<=n;i++){
int x=in(); int k=answer(x-1);//小于等于x-1的个数
ans1+=(long long)(i-k-1)*(n-i-x+1+k);//大于x的数*小于x的数
ans2+=(long long)k*(x-1-k);//小于x的数*大于x的数
add(x,1);//插入新的x
}
return !printf("%lld %lld",ans1,ans2);
}