1 条题解

  • 0
    @ 2022-08-04 15:51:59

    #include<iostream>
    #include<cstdlib>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    #include<cmath>
    #include<map>
    using namespace std;
    int n,m;
    long long s;
    struct no{
    int va;
    int w;
    }node[2000005];
    struct qu{
    int li,ri;
    }que[2000004];
    long long sumw[2000005],sumv[2000005];
    long long check(int w){
    memset(sumv,0,sizeof(sumv));
    memset(sumw,0,sizeof(sumw));
    for(int i=1;i<=n;i++)
    {
    sumw[i]=sumw[i-1];
    sumv[i]=sumv[i-1];
    if(node[i].w>=w)
    {
    sumw[i]++;
    sumv[i]+=node[i].va;
    }
    }
    long long ans=0;
    for(int i=1;i<=m;i++)
    {
    ans+=(sumv[que[i].ri]-sumv[que[i].li-1])*(sumw[que[i].ri]-sumw[que[i].li-1]);
    }
    return ans;
    }
    long long minn(long long a,long long b){
    if(a>b)return b;
    return a;
    }
    long long llab(long long a){
    if(a<0)
    return -a;
    return a;
    }
    int main(){
    scanf("%d%d%lld",&n,&m,&s);
    int mx=0;
    for(int i=1;i<=n;i++)
    {
    scanf("%d%d",&node[i].w,&node[i].va);
    mx=max(mx,node[i].w);
    }
    for(int i=1;i<=m;i++)
    scanf("%d%d",&que[i].li,&que[i].ri);
    int li=1,ri=mx;
    long long ans=-1;
    while(li<=ri)
    {
    int mid=(li+ri)/2;
    long long x=check(mid);
    if(ans==-1)ans=llab(x-s);
    ans=minn(ans,llab(x-s));
    if(x>s)
    li=mid+1;
    else
    ri=mid-1;
    }
    printf("%lld\n",ans);
    //while(1);
    return 0;
    }

  • 1

信息

ID
1108
难度
8
分类
其他 | 二分查找 点击显示
标签
递交数
12
已通过
6
通过率
50%
上传者