zhuifeng66666 2022-01-09 20:10 采纳率: 50%
浏览 72
已结题

用Python编写程序,用线段树的方法实现问题的功能,写一下注释

问题遇到的现象和发生背景

有 N 个用从 1 到 N 的整数编号的篮子。每一步,Alice 都会将一定数量的球添加到其中一个篮子中。然后鲍勃问她现在篮子里的球总数是多少,编号从 L 到 R 包括在内。编写一个程序,帮助 Alice 回答问题,而无需每次都数球。

实现数据输入输出例子

img

数据输入解释
输入数据的第一行包含两个整数 N 和 M (1≤N,M≤100000)——篮子的数量和步数。
每个步骤由一个由四个整数 p、k、L 和 R 组成的字符串描述(1≤p≤N,1≤k≤1000, 1≤L≤R≤N):Alice 将 k 个球添加到编号为 p 的篮子中,然后 Bob 询问篮子中编号为 L 到 R 的球的总数。
数据输出解释
打印 整数M,即 Bob 问题的答案。

我想要达到的结果

用Python编写,实现可以满足图片的例子和任意输入输入例子的要求,输出如图 整数M,即 Bob 问题的答案。
输入数据第一行使用n, m = map(int, input().split())
第二行输入随机的四个整数 p、k、L 和 R 组成的字符串
实现输出可以满足如图的例子
3
5
12

  • 写回答

3条回答 默认 最新

  • 广大菜鸟 2022-01-09 22:44
    关注

    这个是现学的,你运行看看能不能过

    class Node:
        def __init__(self, l, r):
            self.l = l
            self.r = r
            self.inc = 0
            self.sum = 0
            self.mid = (self.l + self.r) // 2
    
    
    # 初始化结点基本信息
    def BuildTree(root: int, l: int, r: int, tree: [Node]):
        if root >= len(tree):
            return
        tree[root].l = l
        tree[root].r = r
        mid = (l + r) // 2
        tree[root].mid = mid
        if l == r:
            return
        BuildTree(2 * root + 1, l, mid, tree)
        BuildTree(2 * root + 2, mid + 1, r, tree)
    
    
    # 初始化插入数值
    def Insert(root: int, i: int, v: int, tree: [Node]):
        if root >= len(tree):
            return
        if tree[root].l == i and tree[root].r == i:  # 直系父亲
            tree[root].sum += i
            return
        tree[root].sum += v  # 爷爷辈
        if i <= tree[root].mid:
            Insert(root * 2 + 1, i, v, tree)
        else:
            Insert(root * 2 + 2, i, v, tree)
    
    
    # 在start到end范围内都加上inc
    def Add(root: int, start: int, end: int, inc: int, tree: [Node]):
        if root >= len(tree):
            return
        if tree[root].l == start and tree[root].r == end:  # 范围刚好在这个结点l,r,只需要赋一次值,后面计算直接inc*数量
            tree[root].inc += inc
            return
        tree[root].sum += inc * (end - start + 1)  # 总的增加
        # 对子树增加
        if end <= tree[root].mid:
            Add(root * 2 + 1, start, end, inc, tree)
        elif start > tree[root].mid:
            Add(root * 2 + 2, start, end, inc, tree)
        else:
            Add(root * 2 + 1, start, tree[root].mid, inc, tree)
            Add(root * 2 + 2, tree[root].mid + 1, end, inc, tree)
    
    
    def Query(root: int, start: int, end: int, tree: [Node]):
        if tree[root].l == start and tree[root].r == end:
            return tree[root].sum + tree[root].inc * (end - start + 1)
        tree[root].sum += tree[root].inc * (tree[root].r - tree[root].l + 1)
        Add(2 * root + 1, tree[root].l, tree[root].mid, tree[root].inc, tree)
        Add(2 * root + 2, tree[root].mid + 1, tree[root].r, tree[root].inc, tree)
        tree[root].inc = 0
        if end <= tree[root].mid:  # 区间在root左侧,只需要计算左侧的总和
            return Query(root * 2 + 1, start, end, tree)
        elif start > tree[root].mid:  # 区间在root右侧,只需要计算右侧的总和
            return Query(root * 2 + 2, start, end, tree)
        else:  # 区间在root左右侧都有部分,需要计算两侧的总和
            return Query(root * 2 + 1, start, tree[root].mid, tree) + \
                   Query(root * 2 + 2, tree[root].mid + 1, end, tree)
    
    
    def main():
        n, m = map(int, input().split())
        tree = []
        for _ in range(n * 4):
            tree.append(Node(0, 0))
        BuildTree(0, 1, n, tree)
        for _ in range(m):
            p, k, L, R = map(int, input().split())
            Add(0, p, p, k, tree)
            print(Query(0, L, R, tree))
    
    
    main()
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月24日
  • 已采纳回答 1月16日
  • 修改了问题 1月9日
  • 创建了问题 1月9日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。