题解

cookiebus 2023-09-20 16:19:49 10 返回题目

20分:我不会。

40分:考虑先求这样一个数组:表示lcm的指数中,最多是的方案数有多少种。

比如,就会存所有lcm恰好是的方案。

你可以把读入的看成一个坐标,那么就相当于枚举所有坐标,求它左下角有多少个数字。

求出来数组后,我们用代表恰好是的方案数。那么数组显然就是的二维意义下的前缀和,随便怎么都能恢复回去。

60分:离散化一下其实就是40分。

100分:

我们考虑把所有点按照从小到大排序,然后枚举第个点作为最大的值来计算答案。

这时候,我们用一棵线段树来维护所有这些点对应的

线段树的下标表示的是

比如第一个点是,我们就在线段树第个位置,表示的元素多了一个。

考虑一下怎么算答案:

其实就是枚举对应的指数,然后在线段树上查询的元素有多少个(记作),以及的元素有多少个(记作),然后用作为此时答案的贡献。

这个东西显然可以直接在线段树上维护。

对于插入一个点来说,其实就是所有的位置,贡献都是原先的两倍,的位置,如果原先没有元素,那么贡献就是所有的元素个数之和,如果原先有元素,那么贡献就按上面的做法重新算一遍。

具体涉及到的就是线段树查询区间和,修改单点,以及区间,很好写。

{{ vote && vote.total.up }}