AcWing 499. 聪明的质监员
原题链接
简单
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=2e5+10;
ll w[N],v[N],l[N],r[N],sv[N],sn[N],ans=1e18;
ll n,m,S;
bool check(int mid)
{
sv[0]=0,sn[0]=0;
for(int i=1;i<=n;i++)
{
if(w[i]>=mid)
sv[i]=sv[i-1]+v[i],sn[i]=sn[i-1]+1;
else
sv[i]=sv[i-1],sn[i]=sn[i-1];
}
ll res=0;
for(int i=1;i<=m;i++)
res+=(sn[r[i]]-sn[l[i]-1])*(sv[r[i]]-sv[l[i]-1]);
ans=min(ans,llabs(res-S));
return res>=S;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&S);
for(int i=1;i<=n;i++)scanf("%lld%lld",&w[i],&v[i]);
for(int i=1;i<=m;i++)scanf("%lld%lld",&l[i],&r[i]);
ll l=0,r=1e6+10;
while(l+1<r)
{
ll mid=l+r>>1;
if(check(mid))l=mid;
else r=mid;
}
printf("%lld",ans);
return 0;
}