题意:
题解:
很明显是个三分,因为它满足三分的性质,但是我们已经知道最低点的值了,所以每次都可以和最低点的比较,那么二分也能做。对于快速计算可以使用线段树,当然前缀和也是可以的。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+5;
ll v[N],w[N];
ll num[N],sum[N];
struct edge{
int l,r;
}e[N];
int n,m;
ll check(ll x){
for(int i=1;i<=n;i++){
num[i]=num[i-1]+(w[i]>=x);
sum[i]=sum[i-1]+(w[i]>=x)*v[i];
}
ll ans=0;
for(int i=1;i<=m;i++)
ans=ans+(num[e[i].r]-num[e[i].l-1])*(sum[e[i].r]-sum[e[i].l-1]);
return ans;
}
int main()
{
ll s;
scanf("%d%d%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("%d%d",&e[i].l,&e[i].r);
int l=0,r=1e6,mid;
ll ans=1e18;
while(r>=l){
mid=l+r>>1;
ll val=check(mid);
if(val>=s)
l=mid+1,ans=min(ans,val-s);
else
r=mid-1,ans=min(ans,s-val);
}
printf("%lld\n",ans);
}