AC日记——聪明的质监员 洛谷 P1314
思路:
二分;
代码:
#include <bits/stdc++.h> using namespace std; #define maxn 200005 #define ll long long #define INF 0x7fffffff ll 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; }