BZOJ 1012【线段树】
2024-10-08 13:29:16
题意:
Q L 询问数列最后 L 个数中最大的数。
A n 将 n + t ( t_init = 0 ), 然后插到最后去。
思路:
感觉动态地插入,很有问题。
数组地长度会时常变化,但是可以先预处理就是有2e5个结点(最多)。
然后就是插咯?
它保证query 的时候 L < n(当前数组的长度)
水题。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+20; LL mod;
struct Seg{
LL Max;
int Left,Right;
}q[N*4]; void Build(int num,int Left,int Right)
{
q[num].Left=Left;q[num].Right=Right;
if(Left==Right)
return;
int Mid=(Left+Right)>>1;
Build(num<<1,Left,Mid);
Build(num<<1|1,Mid+1,Right);
} void Update(int num,int k,LL w)
{
if(q[num].Left==q[num].Right&&q[num].Left==k){
q[num].Max=w;
return;
}
int Mid=(q[num].Left+q[num].Right)>>1;
if(Mid>=k)
Update(num<<1,k,w);
else
Update(num<<1|1,k,w);
q[num].Max=max(q[num<<1].Max,q[num<<1|1].Max);
} int query(int num,int Left,int Right)
{
if(q[num].Left>=Left && q[num].Right<=Right)
return q[num].Max;
int Mid=(q[num].Left+q[num].Right)>>1;
if(Mid>=Right)
return query(num<<1,Left,Right);
else if(Mid<Left)
return query(num<<1|1,Left,Right);
else
return max(query(num<<1,Left,Mid),query(num<<1|1,Mid+1,Right));
} int main()
{
char x[5];
int m;
int n=0,L;
LL k,t=0;
Build(1,1,200000);
scanf("%d%lld",&m,&mod);
while(m--)
{
scanf("%s",x);
if(x[0]=='A'){
scanf("%lld",&k);
k=(k+t)%mod;
n++;
Update(1,n,k);
}
else
{
scanf("%d",&L);
int s=n-L+1;
t=query(1,s,n);
printf("%lld\n",t);
}
}
return 0;
}
最新文章
- 【原创】loadrunner12.53 录制脚本时 打不开网页或者打开网页慢?
- Java学习笔记 03 数组
- centos yum安装mysql
- ionic常用命令记录
- Linux 下定时备份数据库以及删除缓存
- python 继承基础
- Linux根据端口号查看进程PID
- centos + nginx + php-fpm +mysql的简单配置
- Vim 多行剪切、复制和删除
- html5-边框属性
- django 浅谈CSRF(Cross-site request forgery)跨站请求伪造
- 【ActiveMQ入门-5】ActiveMQ学习-消息持久性
- OSG漫游到指定坐标点位置
- 通过网络仓库建立本地的yum仓库
- 简单介绍aspose-words-18.10-jdk16做导出word
- 《图说VR入门》——googleVR入门
- 【Markdown】Markdown的使用(自用)
- 优先队列详解priority_queue .RP
- 关于spark RDD trans action算子、lineage、宽窄依赖详解
- Linux 安装、卸载程序