1 条题解

  • 2
    @ 2025-1-26 10:59:21
    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #define int long long
    
    using namespace std;
    
    int n,m,s;
    int w[200500],v[200500];
    int l[200500],r[200500];
    
    int sum_n[200500],sum_v[200500];
    
    long long ans = 0;
    
    void init()
    {
        scanf("%lld%lld%lld",&n,&m,&s);
        for(int i = 1;i <= n; i++)
            scanf("%lld%lld",&w[i],&v[i]);
        for(int i = 1;i <= m; i++)
            scanf("%lld%lld",&l[i],&r[i]);
        
        return ;
    }
    
    long long check(int W)
    {
        long long ans = 0;
        for(int i = 1;i <= n; i++)
        {
            if( W > w[i] )// 要用前缀和,不然会炸掉!!!
            {
                sum_n[i] = sum_n[i-1];
                sum_v[i] = sum_v[i-1]; 
            }
            else
            {
                sum_n[i] = sum_n[i-1] + 1;
                sum_v[i] = sum_v[i-1] + v[i]; 
            }
        }
    
        for(int i = 1;i <= m; i++)
        {
            long long a,b;
            a = sum_v[r[i]] - sum_v[l[i]-1];
            b = sum_n[r[i]] - sum_n[l[i]-1];
            ans += a*b;
        }
    
        return ans;
    }
    
    long long _abs(long long a)
    {
        if( a > 0 )
            return a;
        return -a;
    }
    
    signed main()
    {
        init();
    
        int left = 0,right = 1000000,mid;
    
        while( left <= right )
        {
            mid  = (left + right)>>1;
            if( check(mid) > s )
                left = mid + 1;
            else    
                right = mid - 1;
        }
        ans = _abs(check(left) - s);
        
        if( _abs(check(right) - s) < ans )
            ans = _abs(check(right) - s);
        
        printf("%lld",ans);
        return 0;
    }
    
    • 1

    信息

    ID
    720
    时间
    1000ms
    内存
    128MiB
    难度
    8
    标签
    递交数
    11
    已通过
    7
    上传者