1 条题解
-
0
首先我们看到答案是求
所以说我们可以想到按照 的大小排序
然后在排序的时候我们开两个树状数组,我们可以求出来对于任意一个 前面有多少个比它小的数,与比他小的数的位置的前缀和
然后在统计答案的时候,我们可以同时求出来 前面比它大的和比它小的,并且算出来答案
n=reads(); for(int i=1;i<=n;i++){ a[i].w=reads(),a[i].x=reads(); maxn=max(maxn,a[i].x); } sort(a+1,a+n+1,cmp); // for(int i=1;i<=n;i++){ // cout<<a[i].w<<" "<<a[i].x<<endl; // } for(int i=1;i<=n;i++){ int low=asks(a[i].x,0),up=sum[i-1]-low,lownum=asks(a[i].x,1),upnum=i-1-lownum; // cout<<i<<" "<<low<<" "<<lownum<<" "<<up<<" "<<upnum<<" "<<a[i].x<<" "<<a[i].w<<" "; ans+=(1ll*abs(low-lownum*a[i].x)+up-upnum*a[i].x)*a[i].w; add(a[i].x,a[i].x,0),add(a[i].x,1,1); sum[i]=sum[i-1]+a[i].x; // cout<<ans<<endl; } printf("%lld\n",ans);
- 1
信息
- ID
- 83
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 73
- 已通过
- 23
- 上传者