博客
关于我
POJ 1195 Mobile phones
阅读量:793 次
发布时间:2023-03-03

本文共 2174 字,大约阅读时间需要 7 分钟。

为了解决这个问题,我们需要处理基站报告的变化,并回答关于矩形区域内活动手机总数的查询。我们可以使用二维树状数组来高效地处理点更新和区间查询操作。

方法思路

  • 问题分析:题目要求处理多个指令,其中包括初始化、更新和查询操作。每个基站会报告活动手机数量的变化,我们需要在查询时返回指定矩形区域内的活动手机总数。
  • 数据结构选择:使用二维树状数组来处理点更新和区间查询。树状数组能够高效地支持这两种操作,时间复杂度为O(log S)。
  • 坐标转换:由于树状数组通常使用1-based索引,我们将输入的0-based坐标转换为1-based。
  • 处理指令:分别处理不同指令,更新树状数组或返回查询结果。
  • 解决代码

    import sys
    def main():
    # 读取输入直到遇到指令3
    while True:
    line = sys.stdin.readline()
    if not line:
    break
    line = line.strip()
    if not line:
    continue
    parts = list(map(int, line.split()))
    op = parts[0]
    if op == 3:
    break
    if op == 0:
    S = parts[1]
    S_val = S
    c = [[0]*(S_val +1) for _ in range(S_val +1)]
    elif op == 1:
    x = parts[1]
    y = parts[2]
    a = parts[3]
    # 更新坐标为x+1, y+1
    i = x +1
    j = y +1
    while i <= S_val:
    bit = i & -i
    while j <= S_val:
    bit2 = j & -j
    c[i][j] += a
    j += bit2
    i += bit
    elif op == 2:
    l = parts[1]
    b = parts[2]
    r = parts[3]
    t = parts[4]
    # 转换为1-based
    l1 = l +1
    b1 = b +1
    r1 = r +1
    t1 = t +1
    # 计算区域和
    # sum(r1, t1) - sum(l1-1, t1) - sum(r1, b1-1) + sum(l1-1, b1-1)
    def get_sum(x, y):
    res = 0
    i = x
    while i > 0:
    bit = i & -i
    j = y
    while j > 0:
    res += c[i][j]
    j -= bit
    i -= bit
    return res
    total = get_sum(r1, t1) - get_sum(l1-1, t1) - get_sum(r1, b1-1) + get_sum(l1-1, b1-1)
    print(total)
    else:
    continue
    if __name__ == "__main__":
    main()

    代码解释

  • 读取输入:从标准输入读取直到遇到指令3。
  • 初始化:指令0读取S,初始化二维树状数组。
  • 更新操作:指令1读取x、y、a,将a加到对应的树状数组位置。
  • 查询操作:指令2读取l、b、r、t,计算指定矩形区域内的活动手机总数。
  • 树状数组实现:使用二维树状数组,支持点更新和前缀和查询,确保高效处理大规模数据。
  • 该方法能够高效处理多个指令,确保在合理时间内完成查询和更新操作。

    转载地址:http://uuxfk.baihongyu.com/

    你可能感兴趣的文章