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;
}

 

posted @ 2017-06-07 16:12  IIIIIIIIIU  阅读(204)  评论(0编辑  收藏  举报