[省选] [线段树] [BZOJ1012] [JSOI2008] 最大值 (max)

本文介绍了一种基于线段树的数据结构算法,用于处理一系列添加和询问操作。通过实例讲解了如何利用线段树实现高效的查询和更新操作,特别适用于序列中最大值的查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description 题目描述

给定一列正整数 a 1 , a 2 , … , a n a_1,a_2,… ,a_n a1a2an,每一个数都在 0 0 0 p − 1 p-1 p1之间。可以对这列数进行两种操作:
添加操作:向序列后添加一个数,序列长度变成 n + 1 n+1 n+1
询问操作:询问这个序列中最后 L L L个数中最大的数是多少.
程序运行的最开始,整个序列为空。写一个程序,读入操作的序列,并输出询问操作的答案.

Input 输入

输入文件的第一行有两个正整数 m ( 1 ≤ m ≤ 2 ∗ 1 0 5 ) m(1≤m≤2*10^5) m(1m2105) p ( 1 ≤ p ≤ 2 ∗ 1 0 9 ) p(1≤p≤2*10^9) p(1p2109)
接下来的 m m m行,每行表示一个操作。
如果该行的内容是 Q Q Q L L L,则表示这个操作是询问序列中最后 L L L个数的最大数是多少;
如果是 A A A t ( 0 ≤ t ≤ p ) t(0≤t≤p) t(0tp),则表示向序列后面加一个数,加入的数是: ( t + a ) (t+a) (t+a)除以 p p p的余数。
其中, t t t是输入的参数, a a a是在这个添加操作之前最后一个询问操作的答案(如果之前没有询问操作,则 a = 0 a=0 a=0)。
第一个操作—定是添加操作。对于询问操作, L > 0 L>0 L>0且不超过当前序列的长度。

Output 输出

对于每一个询问操作,输出一行。该行只有一个数,即序列中最后 L L L个数的最大数

Sample Input 样例输入

10 100
A 97
Q 1
Q 1
A 17
Q 2
A 63
Q 1
Q 1
Q 3
A 99

Sample Output 样例输出

97
97
97
60
60
97

很明显,这道题是裸线段树,先建一棵空树,开一个计数器记下已经进入的个数,两个操作就可以抽象为:
(1)加入操作(eg:加入 R R R) 改一下 n u m num num位置的值为 ( R + l a s t ) % p (R+last)\%p (R+last)%p
(2)查询操作(eg:查最后 R R R个) 查一下 [ n u m − R + 1 , n u m ) [num-R+1,num) [numR+1,num)的最大值即可
其实是水题,并没有怎么卡(想要卡的?看看2015山东省选第二轮D1 音质检测…)
上代码…
Code

线段树真是好东西…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值