对于100%的数据,1<=n<=100000,0<=Hi<=1000000。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <stack> #include <map> #include <set> #include <vector> #include <queue> #define mem(p,k) memset(p,k,sizeof(p)); #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define inf 0x6fffffff #define LL long long using namespace std; LL tree[1100000],n,maxx,a[110000],num[110000],total[100010]; int lowbit(int i){ return (-i)&i; } LL query(int k){ LL sum=0;//cout<<sum<<endl; for(int i=k;i>=1;i-=lowbit(i)){ sum+=tree[i]; } return sum; } void update(int k){ for(int i=k;i<=maxx;i+=lowbit(i)){ tree[i]++; } } int main() { total[0]=0; for(int i=1;i<100010;i++){ total[i]=total[i-1]+i; } while(cin>>n){ LL sum=0; mem(tree,0); maxx=-1; for(int i=0;i<n;i++){ scanf("%lld",num+i); num[i]++;//cout<<"asd"<<endl; maxx=max(maxx,num[i]); } for(int i=0;i<n;i++){ a[i]=i-query(num[i]);//cout<<a[i]<<endl; update(num[i]); } mem(tree,0); for(int i=n-1;i>=0;i--){ a[i]+=query(num[i]-1); update(num[i]); sum+=total[a[i]]; } cout<<sum<<endl; } return 0; }