在蓝桥杯中用python语言求算法提高试题理想国题目
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在蓝桥杯中用python语言求算法提高试题理想国题目
题目描述:
有一个长为 n 的序列 a,一开始序列中的每个数 ai 都为 0。
现在
你需要进行 m 次操作,每次操作如下:
1.将区间[l,r]内的每个数加上x。
2.查询区间[l,r]内的最大值。
输入格式:
第一行输入两个整数n和m。
接下来 m 行,每行包含三个整数 op、l、r 和 x,op 表示操作类型,op=1 表示进行加法操作,op=2 表示进行查询操作。
输出格式:
每个查询操作输出一个结果,每个结果占一行。
输入样例:
55。
1155。
2150。
1232。
2250。
2130。
输出样例:
5。
7。
2。
算法分析:
本题使用线段树的思想。
首先,我们需要定义一个结构体来表示线段树,结构体中包含以下几个元素:
l,r:线段树当前节点表示的区间范围,闭区间[l,r]。
dat:节点表示的值,本题中表示[l,r]的最大值。
lazy:该节点需要懒惰更新的值,本题中表示该节点下属的区间需要加的值。
L-tree和R-tree:该节点的两个儿子节点。
build函数用于创建线段树。
update函数用于更新[rl,rr]区间加x,也就是进行1操作的情况。
query函数用于查询[ql,qr]区间的最大值,max和查询时直接使用。
pushdown函数用于懒惰更新,也就是将lazy下发到两个子节点上。
具体细节见代码注释。