https://codeforces.com/contest/2037/problem/F
在数轴上,有n个怪物,每个怪物处于$x_i$位置,有$h_i$血量。
我们可以在数轴上选择任意一个点p,我们有一个攻击力m,可以对某点造成该点到p距离递减的伤害,即距离p点为0,造成m点伤害,为1则造成m-1点伤害,形式化表达为:可以对点x造成$max(0,m-|p-x|)$点伤害。
求消灭k个怪物,的最少攻击次数。n,k为1e5数量级,x、h为1e9数量级
即求一个有k个怪物的区间:$$min(max(\frac{h_i}{max(0,m-|p-x_i|)}))$$
对于最小最大化问题,肯定选择二分。但是二分选点显然意义。
二分攻击次数,则没有O(n)的方法,但是考虑二分意义,可以求出对于每个怪物来说要在mid次攻击以内击败他,我们选点p的区间。
求出n个区间后判断是否存在一个点是k个区间的交点。这里一开始本来是想按右端点排序然后双指针做的,但是wa了,wa之后好像找出了这个做法的错例,但是换方法ac之后又找不出来了(。
总之可以差分,然后排序所有端点,然后求前缀和即可。
bool check(ll t){
map<ll,ll> mp;
for(auto [x,h]:enemy){
ll del = (h+t-1)/t;
ll dis = m - del;
if(dis<0) continue;
mp[x-dis]++,mp[x+dis+1]--;
}
ll cnt = 0;
for(auto [x,v]:mp){
cnt += v;
if(cnt>=k) return true;
}
return false;
}