1 条题解

  • 0
    @ 2025-11-18 19:31:41

    题目分析

    我们有一个无限长的01序列TT,它由长度为nn的循环节SS重复构成。定义fi=ciif_i = \frac{c_i}{i},其中cic_i是前ii个位置中1的个数。

    我们需要处理两种查询:

    1. 找到序列ff中第kk大的值所在的位置ww
    2. 查询fkf_k在序列ff中的排名(如果不存在则输出inf)

    比较规则:fa>fbf_a > f_b 或 (fa=fbf_a = f_ba<ba < b)

    关键观察

    1. 分数表示与比较

    对于位置ii,有:

    $$f_i = \frac{c_i}{i} = \frac{\lfloor \frac{i-1}{n} \rfloor \cdot c_n + c_{((i-1) \bmod n) + 1}}{i} $$

    定义ri=cinicnr_i = c_i \cdot n - i \cdot c_n,则比较faf_afbf_b的大小等价于比较:

    $$\frac{c_a}{a} \leq \frac{c_b}{b} \iff c_a \cdot b \leq c_b \cdot a \iff r_a \cdot b \leq r_b \cdot a $$

    2. 特殊性质

    代码中的flag变量标记了特殊情况:当所有ri0r_i \leq 0时,即cn=0c_n = 0或序列具有特殊结构时,可以采用简化的计算方法。

    算法思路

    高精度处理

    由于kk可能达到101000010^{10000},需要实现高精度整数类Int

    • 采用基数为101810^{18}的表示法
    • 支持加、乘、除、取模等运算

    查询类型1:找第k大的位置

    特殊情况处理 (flag = true)

    当所有ri0r_i \leq 0时:

    1. 统计ri=0r_i = 0的位置数量cntcnt
    2. 将大数kk分解为:k=qcnt+rk = q \cdot cnt + r
    3. 答案位置为qn+r个满足ri=0的位置q \cdot n + \text{第}r\text{个满足}r_i=0\text{的位置}

    一般情况处理

    1. 统计所有ri>0r_i > 0的位置的rir_i之和sumsum
    2. kk分解为:k=qsum+rk = q \cdot sum + r
    3. 使用二分法找到满足条件的分数边界
    4. 在候选位置中找到第rr个位置

    查询类型2:查询排名

    特殊情况处理 (flag = true)

    rk0r_k \leq 0时直接返回inf,否则:

    1. 统计ri0r_i \geq 0的位置数量cntcnt
    2. 计算位置kk在循环节中的排名
    3. 结合循环次数计算总排名

    一般情况处理

    1. 如果rk0r_k \leq 0,返回inf
    2. 将位置kk分解为在循环节中的信息
    3. 统计所有比fkf_k大的分数个数
    4. 使用数学公式计算总排名

    复杂度分析

    • 预处理O(n)O(n)计算前缀和和rir_i数组
    • 每次查询
      • 高精度运算:与数字位数相关
      • 二分查找:O(log(n3))=O(logn)O(\log(n^3)) = O(\log n)
      • 候选位置排序:最坏O(nlogn)O(n \log n)
    • 总体:由于q20q \leq 20,算法可以接受

    代码实现要点

    1. 高精度类Int:使用vector<ll>101810^{18}为基数存储大整数
    2. 分数比较:通过交叉相乘避免浮点数精度问题
    3. 循环节处理:利用模运算将无限序列问题转化为有限问题
    4. 边界情况:特别注意ri=0r_i = 0ri<0r_i < 0的情况

    样例验证

    对于样例1:

    • 序列100n=3n=3cn=1c_n=1
    • r1=1×31×1=2r_1 = 1\times3 - 1\times1 = 2
    • r2=1×32×1=1r_2 = 1\times3 - 2\times1 = 1
    • r3=1×33×1=0r_3 = 1\times3 - 3\times1 = 0

    查询结果与题目输出一致。

    该算法通过数学分析和高效的高精度运算,成功解决了大规模数据下的排名查询问题。

    • 1

    信息

    ID
    5453
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者