其他分享
首页 > 其他分享> > CF1574 C. Slay the Dragon(三分)

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

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()
{
    //IOS;
    while(~ sd(n)){
        rep(i, 1, n){
            sll(a[i]);
            sum += a[i];
        }
        sort(a + 1, a + 1 + n);
        sd(m);
        while(m --> 0){
            sll2(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)));
            }
            pll(ans);
        }
    }
    //PAUSE;
    return 0;
}

标签:Slay,int,res,ll,CF1574,Dragon,ans,骑士,sum
来源: https://www.cnblogs.com/Segment-Tree/p/15317529.html