求助

P1314 [NOIP2011 提高组] 聪明的质监员

ez_lcw @ 2019-09-05 13:43:20

#include<bits/stdc++.h>
using namespace std;
long long ans=0x7f7f7f7f7f7f,s;
int n,sum[2000010],num[2000010],m,minn=0x7f7f7f7f,maxn=-0x7f7f7f;
struct data
{
    int w,v;
}a[2000010];
struct node
{
    int l,r;
}b[2000010];
long long work(long long a)
{
    if(a<0)
    {
        return -a;
    }
    return a;
}
bool check(int w)
{
    long long tot=0;
    for(int i=1;i<=n;i++)
    {
        sum[i]=sum[i-1];
        num[i]=num[i-1];
        if(a[i].w>=w)
        {
            sum[i]+=a[i].v;
            num[i]++;
        }
    }
    for(int i=1;i<=m;i++)
    {
        tot+=(sum[b[i].r]-sum[b[i].l-1])*(num[b[i].r]-num[b[i].l-1]);
    }
    long long ans1=work(tot-s);
    if(ans1<ans)
    {
        ans=ans1;
    }
    if(tot==s)
    {
        puts("0");
        exit(0);
    }
    return tot>s;
}
int main()
{
    scanf("%d%d%lld",&n,&m,&s);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i].w,&a[i].v);
        minn=min(minn,a[i].w);
        maxn=max(maxn,a[i].w); 
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&b[i].l,&b[i].r);
    }
    int l=minn-10,r=maxn+10;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(check(mid))
        {
            l=mid+1;
        }else{
            r=mid-1;
        }
    }
    printf("%lld\n",ans);
    return 0;
}

by ez_lcw @ 2019-09-05 13:43:36

WA90


|