第一道树状数组
代码:
#include<iostream>
#include<fstream>using namespace std;int n;struct e{int v,x;
};e a[20001];long long cnt[20001],sum[20001];int lowbit(int x){return x&(x^(x-1));
}void modify(long long a[],int s,int t){while(s<=20000){a[s]+=t;s+=lowbit(s);}
}long long getsum(long long a[],int s){long long ans=0;while(s>0){ans+=a[s];s-=lowbit(s);}return ans;
}int cmp(const void *a,const void *b){return (*(e *)a).v-(*(e*)b).v;
}void read(){
// ifstream cin("in.txt");int i,j,k;long long total=0,ans=0;cin>>n;for(i=1;i<=n;i++)cin>>a[i].v>>a[i].x;qsort(a+1,n,sizeof(e),cmp);modify(cnt,a[1].x,1);modify(sum,a[1].x,a[1].x);total+=a[1].x;for(i=2;i<=n;i++){modify(cnt,a[i].x,1);modify(sum,a[i].x,a[i].x);long long s,t;s=getsum(cnt,a[i].x);t=getsum(sum,a[i].x);total+=a[i].x;ans+=a[i].v*(s*a[i].x-t+total-t-a[i].x*(i-s));}cout<<ans<<endl;}int main(){read();return 0;
}