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