和Disharmony Trees HDU - 3015神似
// max(vi,vj) * |posi - posj| #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; typedef long long ll; #define maxn 20005 int tr1[maxn],tr2[maxn]; struct tree{ int pos,val; }Tr[maxn]; //按照位置排序 bool cmp(tree e1,tree e2){ return e1.pos<e2.pos; } int lowbit(int x) { return x&(-x); } void add(int c[],int x,int v) { for(int i=x;i<maxn;i+=lowbit(i)) c[i]+=v; } int query(int c[],int x) { int ans = 0; for(int i=x;i;i-=lowbit(i)) ans+=c[i]; return ans; } int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d %d",&Tr[i].val,&Tr[i].pos); //按照位置排序 sort(Tr+1,Tr+1+n,cmp); memset(tr1,0,sizeof tr1); memset(tr2,0,sizeof tr2); long long ans=0,pos; int cnt; for(int i=1;i<=n;++i) { //比 a[i].val小的个数 cnt=query(tr1,Tr[i].val-1); //加进去 add(tr1,Tr[i].val,1); //比a[i].val小的数的坐标的和 pos=query(tr2,Tr[i].val-1); //加进去 add(tr2,Tr[i].val,Tr[i].pos); ans+=(ll)Tr[i].val*(cnt*Tr[i].pos-pos); } memset(tr1,0,sizeof tr1); memset(tr2,0,sizeof tr2); for(int i=n;i>=1;--i) { cnt=query(tr1,Tr[i].val); add(tr1,Tr[i].val,1); pos=query(tr2,Tr[i].val); add(tr2,Tr[i].val,Tr[i].pos); ans+=(ll)Tr[i].val*(pos-cnt*Tr[i].pos); } printf("%lld ",ans); }