本题乍一看,要对S-Y进行二分,仔细分析可知,应该对W进行二分。本题是二分答案的变体,S>Y时,应该r=mid-1;S=Y时,应该输出;S<Y时 应该l=mid+1;代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll abs(ll x){
return (x>0)?x:(-x);
}
int n,m;
ll S;
int w[200001],v[200001];
int l[200001],r[200001];
ll val[200001],num[200001];
ll judge(int W){
for(int i=1;i<=n;i++){
if(w[i]>=W)val[i]=val[i-1]+v[i],num[i]=num[i-1]+1;
else val[i]=val[i-1],num[i]=num[i-1];
}
ll ans=0;
for(int i=1;i<=m;i++){
ans+=(val[r[i]]-val[l[i]-1])*(num[r[i]]-num[l[i]-1]);
}
return ans;
}
int main(){
cin>>n>>m>>S;
int minn=10e8,maxx=-10e8;
for(int i=1;i<=n;i++){
cin>>w[i]>>v[i];
minn=min(minn,w[i]),maxx=max(maxx,w[i]);
}
for(int i=1;i<=m;i++){
cin>>l[i]>>r[i];
}
int l=minn-1,r=maxx+1;
ll ans=10e13;
while(l<=r){
int mid=(l+r)>>1;
ll tans=judge(mid);
if(tans-S>0){
l=mid+1;
}
else{
r=mid-1;
}
ans=min(abs(tans-S),ans);
}
cout<<ans;
return 0;
}