将冰火人分别按温度升序排序,冰人选择的是一段前缀,火人选择的是一段后缀。 消耗的能量即 选择的冰人能量总和 和 火人能量总和 较小的的一方的两倍。 选择的温度一定是某个人的温度。由结论 2,考虑先离散化温度,以下讨论中的温度均指离散化后的温度。
考虑用数据结构维护fice(k)fice(k)和ffire(k)ffire(k),我们需要支持区间加、单点查询。例如,每个冰系战士,是对所有k≥xik≥xi(一段后缀),令它们的fice(k)fice(k)值加上yiyi;一个火系战士,是对所有k≤xik≤xi(一段前缀),令它们的ffire(k)ffire(k)值加上yiyi。(当然,你也可以转化,或者说理解为,...
这样一来我们不能使用线段树,那么只能使用树状数组了,查询很好解决,冰系直接查前缀,火系总和减去前缀即可。然后是一个重要的 trick,我们可以在树状数组上用倍增的方式来实现二分的操作。因为树状数组上编号为ii的节点保存的是(i−lowbit(i),i](i−lowbit(i),i]的信息,这样我们从高位向低位枚举,类似求 LCA ...
考虑到我们只是维护前缀和这样的形式,所以我们可以考虑维护一个前缀和的树状数组,然后在上面倍增找到minmin函数的最值 这种手段常用于维护一个前缀和然后求满足某条件的lower/upperboundlower/upperbound Code #include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineFor(i,a,b)for(registerinti=a;i<=...