题面
每次注册或取消,都是在对应温度值的下标修改能量值。同时维护能量值的前缀和。每次比赛的能量值为冰火能量取最小乘二。随着温度升高,冰队的能量值不会降低,火队的能量值不会升高,具有单调性。因此考虑二分温度。
每次二分都更新答案,若冰队能量值小于火队,则将温度调大;否则将温度调小,并找出某个时能量值最高的温度。但这样二分并不能求出最佳温度。所以需要再次二分温度,此时的温度小于等于之前二分的温度或答案等于实际答案则将温度调大,否则调小。
此题温度规模过大,需要离散化,时间复杂度 O ( q 2 l o g 2 q ) O(q^2log_2q) O(q2log2q)
利用树状数组优化:https://blog.csdn.net/Defener/article/details/106926034
时间复杂度 O ( q l o g 2 q ) O(qlog_2q) O(qlog2q),空间复杂度 O ( q ) O(q) O(q)
#include<stdio.h>
#include<algorithm>
#define R register int
#define I inline
#define N 2000001
struct Fighter{
int type,energe,temp;
}f[N];
int dist[N],ct,forw[N],firesum;
I int GetDist(int x){
return std::upper_bound(dist