思路:
二分;
代码:
#includeusing namespace std;#define maxn 200005#define ll long long#define INF 0x7fffffffll n,m,sum[maxn],wi[maxn],vi[maxn],s;ll li[maxn],ri[maxn],sumn[maxn],flag;inline void in(ll &now){ char Cget=getchar();now=0; while(Cget>'9'||Cget<'0')Cget=getchar(); while(Cget>='0'&&Cget<='9') { now=now*10+Cget-'0'; Cget=getchar(); }}int solve(ll val){ sum[0]=0,sumn[0]=0; for(ll i=1;i<=n;i++) { sum[i]=sum[i-1],sumn[i]=sumn[i-1]; if(wi[i]>=val) sum[i]+=vi[i],sumn[i]++; } ll res=0; for(ll i=1;i<=m;i++) res+=(sumn[ri[i]]-sumn[li[i]-1])*(sum[ri[i]]-sum[li[i]-1]); if(res>=s) { flag=res-s; return false; } else { flag=s-res; return true; }}int main(){ in(n),in(m),in(s); for(ll i=1;i<=n;i++) in(wi[i]),in(vi[i]); for(ll i=1;i<=m;i++) in(li[i]),in(ri[i]); ll l=0,r=1000000,ans,mid; while(l<=r) { mid=l+r>>1; if(solve(mid)) ans=mid,r=mid-1; else l=mid+1; } solve(ans);ll ansl=flag; solve(ans-1);ll ansr=flag; printf("%lld",min(ansl,ansr)); return 0;}