题目链接
这道二分题特别之处在于评判标准比较特殊,是求范围最接近的值
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 200010;
#define int long long
int n,m,s;
int L[N],R[N],w[N],v[N];
int check(int mid)
{
int cnt1[N]={0},cnt2[N]={0};
for(int i=1;i<=n;i++)
{
if(w[i]>=mid)
{
cnt1[i]=cnt1[i-1]+1;
cnt2[i]=cnt2[i-1]+v[i];
}
else
{
cnt1[i]=cnt1[i-1];
cnt2[i]=cnt2[i-1];
}
}
int sum=0;
for(int i=1;i<=m;i++)sum+=(cnt1[R[i]]-cnt1[L[i]-1])*(cnt2[R[i]]-cnt2[L[i]-1]);
return sum;
}
signed main()
{
cin>>n>>m>>s;
int l=0,r=0;
for(int i=1;i<=n;i++)cin>>w[i]>>v[i],r=max(r,w[i]);
for(int i=1;i<=m;i++)cin>>L[i]>>R[i];
while(l<r)
{
int mid=l+r>>1;
if(check(mid)<=s)r=mid;
else l=mid+1;
}
int a=check(l)>=s?check(l)-s:s-check(l);
int b=check(l-1)>=s?check(l-1)-s:s-check(l-1);
cout<<min(a,b)<<endl;
}