树状数组求逆序对
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> #include<cstdlib> #include<map> #include<queue> #include <deque> #include <list> #include <ctime> #include <stack> #include <vector> #include<set> #define Maxn 100005 #define MOD typedef long long ll; #define FOR(i,j,n) for(int i=j;i<=n;i++) #define DFR(i,j,k) for(int i=j;i>=k;--i) #define lowbit(a) a&-a #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int inf = 0x3f3f3f3f; const double pi = acos(-1.0); using namespace std; ll c[Maxn],a[Maxn]; void add(int i,int val) { while(i<=Maxn) { c[i]+=val; i+=lowbit(i); } } int sum(int i) { int s=0; while(i>0) { s+=c[i]; i-=lowbit(i); } return s; } int main() { int n; while(~scanf("%d",&n)) { ll ans=0; memset(c,0,sizeof c); FOR(i,1,n) scanf("%d",&a[i]); FOR(i,1,n) { ans +=(i-1-sum(a[i]))*a[i]; add(a[i],1); } memset(c,0,sizeof c); DFR(i,n,1) { ans += a[i]*sum(a[i]-1); add(a[i],1); } printf("%I64d\n",ans); } return 0; }