首页 > 其他分享 >20240924

20240924

时间:2024-10-04 20:44:22浏览次数:1  
标签:那么 frac 半仙 val times 20240924 我们

[牛半仙的妹子 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}\),由于不想重新编号了,那就假设点权就是编号

image

但是我们可以确定,我们一但打死了 \(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

相关文章