二分w进行求解,(w增大检验值的和减小)
#include<bits/stdc++.h>
using namespace std;
int m,n,w[1000005],q[1000005],e[1000005],r[1000005];
long long k=0x3f3f3f3f3f,l,mp1[1000005],mp2[1000005];
bool sf1(int z){
for(int y=1;y<=n;y++){
if(w[y]>=z){
mp1[y]=mp1[y-1]+1;
mp2[y]=mp2[y-1]+q[y];
}
else mp1[y]=mp1[y-1],mp2[y]=mp2[y-1];
}
long long h=0;
for(int y=1;y<=m;y++) h+=(mp1[r[y]]-mp1[e[y]-1])*(mp2[r[y]]-mp2[e[y]-1]);
k=min(k,abs(h-l));
return h<l?0:1;
}
void sf(){
int lc=0,rc=w[0],md;
while(lc<=rc){
md=lc+(rc-lc)/2;
if(sf1(md))lc=md+1;
else rc=md-1;
}
}
int main(){
scanf("%d%d%lld",&n,&m,&l);
for(int z=1;z<=n;z++){
scanf("%d%d",&w[z],&q[z]);
if(w[z]>w[0]) w[0]=w[z];
}
for(int z=1;z<=m;z++) scanf("%d%d",&e[z],&r[z]);
sf();
printf("%lld",k);
return 0;
}```