
线段树基础模板
线段树构建:使用线段树来存储工兵营地的人数。每个节点存储其对应区间的总和。 更新操作:当某个营地的人数增加或减少时,更新对应的线段树节点,并向上传播到父节点。 查询操作:查询某个区间的总人数时,递归地检查区间是否在当前节点的范围内,如果是,则返回当前节点的和;否则,继续递归到左或右子树,直到覆盖整个查询区间。 输入处理:读取输入数据,处理每个测试用例。 线段树构建:使用递归函数 更新操作:递归函数 查询操作:递归函数 输出结果:处理完每个测试用例后,输出结果。
发布日期:2021-05-13 21:09:28
浏览次数:18
分类:精选文章
本文共 2668 字,大约阅读时间需要 8 分钟。
为了解决这个问题,我们需要高效地处理工兵营地的人数变动和查询。线段树是一种适合这种操作的数据结构,因为它可以在O(log n)的时间内完成更新和查询操作。
方法思路
解决代码
import sysdef main(): input = sys.stdin.read().split() ptr = 0 T = int(input[ptr]) ptr += 1 for case in range(1, T + 1): N = int(input[ptr]) ptr += 1 a = list(map(int, input[ptr:ptr + N])) ptr += N size = 1 while size < N: size <<= 1 tree = [0] * (2 * size) def build(node, start, end): if start == end: tree[node] = a[start - 1] else: mid = (start + end) // 2 build(2 * node, start, mid) build(2 * node + 1, mid + 1, end) tree[node] = tree[2 * node] + tree[2 * node + 1] build(1, 1, size) def update(node, start, end, idx, value): if start == end: tree[node] += value else: mid = (start + end) // 2 if idx <= mid: update(2 * node, start, mid, idx, value) else: update(2 * node + 1, mid + 1, end, idx, value) tree[node] = tree[2 * node] + tree[2 * node + 1] def query(node, start, end, l, r): if r < start or end < l: return 0 if l <= start and end <= r: return tree[node] mid = (start + end) // 2 left = query(2 * node, start, mid, l, r) right = query(2 * node + 1, mid + 1, end, l, r) return left + right while True: cmd = input[ptr] ptr += 1 if cmd == 'End': break if cmd == 'Add': i = int(input[ptr]) j = int(input[ptr + 1]) ptr += 2 update(1, 1, size, i, j) elif cmd == 'Sub': i = int(input[ptr]) j = int(input[ptr + 1]) ptr += 2 update(1, 1, size, i, -j) elif cmd == 'Query': i = int(input[ptr]) j = int(input[ptr + 1]) ptr += 2 res = query(1, 1, size, i, j) print(res) print(f"Case {case}:")if __name__ == "__main__": main()
代码解释
build
构建线段树,初始化每个节点的值。update
处理加减人数操作,确保线段树节点的值及时更新。query
处理区间查询,返回相应区间的总和。通过这种方法,我们可以高效地处理工兵营地的人数变动和查询,确保程序在处理大量数据时也能保持高效。
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月19日 20时33分54秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
c++ hpp使用好处
2019-03-12
Mac 使用Eclipse老是闪退解决方案
2019-03-12
谈笑间学会-Hbase Rowkey设计
2019-03-12
spark概述
2019-03-12
[密码学] RSA同模攻击与选择密文攻击
2019-03-12
JavaScript 知识梳理[一] 变量类型,浅拷贝,深拷贝
2019-03-12
Linux学习笔记(二):文件权限与目录配置
2019-03-12
Coursera普林斯顿算法课第二次作业
2019-03-12
pip命令 failed to create process.
2019-03-12
做SMTP客户端遇报错:535 Error
2019-03-12
Python3的修改
2019-03-12
SQL基础学习(六)- MySQL的insert语句
2019-03-12
Python HTTP Content-Type常用对照表
2019-03-12
win10系统截图快捷键
2019-03-12
Pycharm学习(四)—— Pycharm的terminal介绍
2019-03-12
安装office报错:无法安装64位office,PC上找到了32位程序
2019-03-12
Robotframwork输出日志里中文显示乱码问题
2019-03-12
c++链表实现通讯录管理系统
2019-03-12
设计模式--单一职责原则的个人理解
2019-03-12
go语言学习--day3(函数)
2019-03-12