[牛半仙的妹子 Tree(tree)](http://ac.robo-maker.cn/d/contest/p/ZY1044?tid=66f28cd11bca2159e88c8fb0)
我们会发现其实牛半仙发癫时就等于将以前的标记清空,从头开始,所以我们可以考虑根号分治,如果两个牛半仙发癫的时间间隔小于 \(\sqrt n\) ,那么我们可以直接暴力枚举两个发癫中的两个点,看距离是否小于操作时间之差,如果发癫的时间大于 \(\sqrt n\) ,那么我们可以 \(bfs\) ,每个点只会被遍历到一次,所以时间复杂度就是 \(O(n ^ {\frac {3}{2}})\)。
牛半仙的魔塔 II(tower)
那么我们设要打一个怪物 \(a_i\) 次,怪物攻击力 \(b_i\), 玩家的防御是\(c_i\),奖励是\(val_i\) 。
那么先打 \(i\) 再打 \(j\) 需要扣以下式子点血
\[a_i \times b_i + a_j \times (b_j - val_i) - c_i \times (a_i + a_j) \]如果先打 \(i\) 再打 \(j\) 需要扣以下式子点血
\[a_j \times b_j + a_i \times (b_i - val_j) - c_i \times (a_i + a_j) \]那么我们可以写出一个不等式
\[a_i \times b_i + a_j \times (b_j - val_i) - c_i \times (a_i + a_j) < a_j \times b_j + a_i \times (b_i - val_j) - c_i \times (a_i + a_j)\\ a_i \times b_i + a_j \times b_j - a_j \times val_i < a_j \times b_j + a_i \times b_i - a_i \times val_j \\ -a_j \times val_i < -a_i \times val_j\\ a_j \times val_i > a_i \times val_j\\ \frac {a_i}{val_i} < \frac {a_j}{val_j} \]可是这是一棵树,我们不能随意交换,我们不能确定我们要按照什么顺序删除。
如图,点权表示 \(\frac {a_i}{val_i}\),由于不想重新编号了,那就假设点权就是编号
但是我们可以确定,我们一但打死了 \(4\) 那么接下来我们一定会优先打死 \(1\) ,那么我们可以将 \(4\) 和 \(1\) 合并。
我们考虑节点三,我们就拿 \(\frac {a_4}{val_4}\) 与 \(\frac {a_2}{val_2}\) 比较,但是注意我们的 \(a_4, val_4\) 已经被更新为了 \(a_4 + a_1, val_4 + val_1\) 。
我们如何实现如上操作呢?我们可以维护一个优先队列,比较规则是 \(\frac {a_i}{val_i} < \frac {a_j}{val_j}\),注意如果用小数来比较的话有可能会有精度误差,所以我们可以改为交叉相乘,即 \(a_i \times val_j < a_j \times val_i\) ,然后用并查集维护即可(本人第一次见这种套路)
标签:那么,frac,半仙,val,times,20240924,我们 From: https://www.cnblogs.com/libohan/p/18447249