1 条题解
-
0无影 (吴鹏飞) LV 10 @ 2022-08-04 15:51:59
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
int n,m;
long long s;
struct no{
int va;
int w;
}node[2000005];
struct qu{
int li,ri;
}que[2000004];
long long sumw[2000005],sumv[2000005];
long long check(int w){
memset(sumv,0,sizeof(sumv));
memset(sumw,0,sizeof(sumw));
for(int i=1;i<=n;i++)
{
sumw[i]=sumw[i-1];
sumv[i]=sumv[i-1];
if(node[i].w>=w)
{
sumw[i]++;
sumv[i]+=node[i].va;
}
}
long long ans=0;
for(int i=1;i<=m;i++)
{
ans+=(sumv[que[i].ri]-sumv[que[i].li-1])*(sumw[que[i].ri]-sumw[que[i].li-1]);
}
return ans;
}
long long minn(long long a,long long b){
if(a>b)return b;
return a;
}
long long llab(long long a){
if(a<0)
return -a;
return a;
}
int main(){
scanf("%d%d%lld",&n,&m,&s);
int mx=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&node[i].w,&node[i].va);
mx=max(mx,node[i].w);
}
for(int i=1;i<=m;i++)
scanf("%d%d",&que[i].li,&que[i].ri);
int li=1,ri=mx;
long long ans=-1;
while(li<=ri)
{
int mid=(li+ri)/2;
long long x=check(mid);
if(ans==-1)ans=llab(x-s);
ans=minn(ans,llab(x-s));
if(x>s)
li=mid+1;
else
ri=mid-1;
}
printf("%lld\n",ans);
//while(1);
return 0;
}
- 1