三元上升子序列
树状数组版子题
#include<bits/stdc++.h> using namespace std; const int maxn=3e4+10; int n,m; int c1[maxn],c2[maxn]; int A[maxn],_A[maxn]; int Lef[maxn],Rit[maxn]; inline int _Q(int val){ return lower_bound(_A+1,_A+m+1,val)-_A; } inline int lowbit(int i){ return i&(-i); } void add(int *C,int pos,int val){ while(pos<=maxn){ C[pos]+=val; pos+=lowbit(pos); } } int sum(int *C,int pos){ int res=0; while(pos>0){ res+=C[pos]; pos-=lowbit(pos); } return res; } int main(){ cin>>n; for(int i=1;i<=n;++i){ scanf("%d",&A[i]); _A[i]=A[i]; } sort(_A+1,_A+n+1); m=unique(_A+1,_A+n+1)-(_A+1); for(int i=1;i<=n;++i){ add(c1,_Q(A[i]),1); Lef[i]=sum(c1,_Q(A[i])-1); } for(int i=n;i>=1;--i){ add(c2,_Q(A[i]),1); Rit[i]=n-i-(sum(c2,_Q(A[i]))-1); } long long ans=0; for(int i=2;i<n;++i) ans+=Lef[i]*Rit[i]; cout<<ans; return 0; }