ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1574 C. Slay the Dragon(三分)

2021-09-21 19:02:00  阅读:216  来源: 互联网

标签:Slay int res ll CF1574 Dragon ans 骑士 sum


目录

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有