P1314 聪明的质监员
题目描述
P1314 聪明的质监员
代码
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string.h>
using namespace std;
int w[1000005],v[1000005];
int l[2000005],r[2000005];
int n,m,mx=-1,mi=100000000;
long long s,sum;
int dfs(int k){
long long np[2000005],vp[2000005];
long long y=0;
sum=0;
memset(np,0,sizeof(np));
memset(vp,0,sizeof(vp));
for(int i=1;i<=n;i++)
{
if(w[i]>=k) np[i]=np[i-1]+1,vp[i]=vp[i-1]+v[i];
else np[i]=np[i-1],vp[i]=vp[i-1];
}
for(int i=1;i<=m;i++)
y+=(np[r[i]]-np[l[i]-1])*(vp[r[i]]-vp[l[i]-1]);
sum=labs(y-s);
if(y>s) return 1;
else return 0;
}
int main(){
cin>>n>>m>>s;
for(int i=1;i<=n;i++)
{
cin>>w[i]>>v[i];
mx=max(mx,w[i]);
mi=min(mi,w[i]);
}
for(int i=1;i<=m;i++)
cin>>l[i]>>r[i];
int begin=mi-1,end=mx+2;
long long ans=0x3f3f3f3f3f3f3f3f;
while(begin<=end){
int mid=(begin+end)>>1;
if(dfs(mid)) begin=mid+1;
else end=mid-1;
if(sum<ans) ans=sum;
}
cout<<ans<<endl;
return 0;
}