选拔赛i题小明买年糕

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=200005;
typedef long long ffi;
int n,m;
ffi s;
int l[maxn],r[maxn];
int sl[maxn];
unsigned long long wd[maxn];
struct
{
    int w,v;
}ng[maxn];
ffi check(int val)
{
    memset(sl,0,sizeof(sl));
    memset(wd,0,sizeof(wd));
    for(int i=1;i<=n;i++)
        {if(ng[i].w>val)
        {
            sl[i]=sl[i-1]+1;
            wd[i]=wd[i-1]+ng[i].v;
        }
        else
        {
            sl[i]=sl[i-1];
            wd[i]=wd[i-1];
        }}
        ffi h=0;
    for(int i=1;i<=m;i++)
    {
        int li=l[i];
        int ri=r[i];
        h+=(sl[ri]-sl[li-1])*(wd[ri]-wd[li-1]);
    }
    return s-h;
}
int main()
{
    scanf("%d%d%lld",&n,&m,&s);
    int maxx=0,minn=inf;
    for(int i=1;i<=n;i++)
        {scanf("%d%d",&ng[i].w,&ng[i].v);
        maxx=max(maxx,ng[i].w);
        minn=min(minn,ng[i].w);}
        for(int i=1;i<=m;i++)
        scanf("%d%d",&l[i],&r[i]);

    ffi ans=abs(check((minn+maxx)>>1));
    while(minn<=maxx)
    {
        int mid=(maxx+minn)>>1;
        ffi k=check(mid);
        if(k>=0)
        {
            maxx=mid-1;
        }
        else
        {
            minn=mid+1;
        }
         k=abs(k);
        ans=min(ans,k);
    }

    printf("%lld\n",ans);
#ifdef OJ
	printf("It cost %lf ms!\n", double(clock())/CLOCKS_PER_SEC * 1000);
#endif
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43331783/article/details/88362769
今日推荐