CF1574 C. Slay the Dragon(三分)


目录

Description

\(n\) 个骑士,都有一个能力值 \(a[i]\), 有 \(m\) 个怪物,怪物有两个属性 \(x, y\) ,你可以花费 \(1\) 个金币使得任意一个骑士的能力值 \(+1\),最后派出一个骑士,满足这个骑士 \(a[i]>=x\),其余骑士的能力值之和 \(sum>=y\),求最小花费

State

\(1<=n,m<=2*10^5\)

\(1<=a[i]<=10^{12}\)

\(1<=x<=10^{12},1<=y<=10^{18}\)

Input

4
3 6 2 3
5
3 12
7 9
4 14
1 10
8 7

Output

1
2
4
0
2

Solution

题目给我的感觉就是有两个极端,一个是让能力值最小的英雄出去,但是他消耗的金币可能会很多;另一个是让能力值最大的出去,但是剩下的花费金币会很多,所以大胆的猜测是一个凹函数,套三分的模板

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;

    int n, m, _, k;
    ll a[N];
    ll x, y, sum;

ll C(int mid)
{
    ll res = sum - a[mid];
    ll ans = x - a[mid];
    if(ans < 0) ans = 0;
    res = y - res;
    if(res < 0) res = 0;
    return ans + res;
}

signed main()
{
    while(~ scanf("%d", &n)){
        for(int i = 1; i <= n; i ++){
            scanf("%lld", a + i);
            sum += a[i];
        }
        sort(a + 1, a + 1 + n);
        scanf("%d", &m);
        while(m --> 0){
            cin >> x >> y;
            int l = 1, r = n;
            ll ans = 6e18;
            while(r >= l){
                int midl = l + (r - l) / 3;
                int midr = r - (r - l) / 3;
                if(C(midl) < C(midr)){
                    r = midr - 1;
                }
                else{
                    l = midl + 1;
                }
                ans = min(ans, min(C(l), C(r)));
            }
            printf("%lld\n", ans);
        }
    }
    return 0;
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM