聪明的质监员
【题目分析】
看到最小值,自然就往二分答案上想了。若取得参数W小,则检验结果必然大,反之,检验结果必然小,这是具有明显的单调性的。他让我们求最小的绝对值,那就求呗。
又是一道要注意long long的题目,不开心。
【代码】
#define M 200005
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
void Rd(int &res){
char c;res=0;
while(c=getchar(),!isdigit(c));
do{res=(res<<3)+(res<<1)+(c^48);}while(c=getchar(),isdigit(c));
}
ll abss(ll x){return x>0?x:-x;}
int w[M],v[M],l[M],r[M],ge[M];
ll s,sum[M];
int n,m;
ll chk(int W){
for(int i=1;i<=n;i++){
if(w[i]>=W)ge[i]=ge[i-1]+1,sum[i]=sum[i-1]+v[i];
else ge[i]=ge[i-1],sum[i]=sum[i-1];
}
ll an=0;
for(int i=1;i<=m;i++){
int g=ge[r[i]]-ge[l[i]-1];
ll SUM=sum[r[i]]-sum[l[i]-1];
an+=1ll*g*SUM;
}return an;
}
int main(){
cin>>n>>m>>s;
for(int i=1;i<=n;i++)Rd(w[i]),Rd(v[i]);
for(int i=1;i<=m;i++)Rd(l[i]),Rd(r[i]);
int L=0,R=100000;
while(R-L>1){
int md=L+R>>1;
if(chk(md)>s)L=md;
else R=md;
}cout<<min(abss(chk(L)-s),abss(chk(R)-s))<<endl;
return 0;
}