题解 P1314 【聪明的质监员】

· · 题解

代码如下:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
struct N
{
    long long num,v;
}t[233333];
struct E
{
    long long w,v;
}e[233333];
long long n,m,S,maxn=-0x3f3f,minn=0x3f3f3f,ans=0x3f3f3f3f3f3f3f,sum;
int l[233333],r[233333];
bool check(int W)
{
    memset(t,0,sizeof(t));
    long long Y=0;sum=0;
    for(int i=1;i<=n;i++)
    if(e[i].w>=W)
    {
        t[i].num=t[i-1].num+1;
        t[i].v=t[i-1].v+e[i].v;
    }
    else 
    {
        t[i].num=t[i-1].num;
        t[i].v=t[i-1].v;
    }
    for(int i=1;i<=m;i++)
        Y+=(t[r[i]].v-t[l[i]-1].v)*(t[r[i]].num-t[l[i]-1].num);
    sum=abs(S-Y);
    if(Y>S)return 1;
    else return 0;
}
int main()
{
    cin>>n>>m>>S;
    for(int i=1;i<=n;i++)
    {
        cin>>e[i].w>>e[i].v;
        maxn=max(maxn,e[i].w);
        minn=min(minn,e[i].w);
    }
    for(int i=1;i<=m;i++)
    cin>>l[i]>>r[i];
    int left=minn;int right=maxn;
    while(left<=right)
    {
        int mid=left+right>>1;
        if(check(mid))left=mid+1;
        else right=mid-1;
        if(sum<ans)ans=sum;
    }
    cout<<ans<<endl;
    return 0;
}