2020西工大校赛 A张经理的员工(二分)
本题很容易看出在l和r中间和左边的都去l,其他都去r
之后我们可以二分出l在队列中的位置进行加减法,r同理
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<algorithm> using namespace std; const int N=1e5+10; int a[N],sum[N]; int main(){ int n; int i; int m; cin>>n>>m; for(i=1;i<=n;i++){ scanf("%d",&a[i]); } sort(a+1,a+1+n); for(i=1;i<=n;i++) sum[i]=sum[i-1]+a[i]; while(m--){ int l,r; scanf("%d%d",&l,&r); if(l>r) swap(l,r); int mid=(l+r)/2; int pos=upper_bound(a+1,a+1+n,mid)-a-1; int pos1=upper_bound(a+1,a+1+n,l)-a-1; int pos2=upper_bound(a+1,a+1+n,r)-a-1; long long ans=0; ans+=sum[pos]-sum[pos1]-(pos-pos1)*l; ans+=l*(pos1)-sum[pos1]; ans+=r*(pos2-pos)-(sum[pos2]-sum[pos]); ans+=sum[n]-sum[pos2]-r*(n-pos2); cout<<ans<<endl; } }
没有人不辛苦,只有人不喊疼