「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数
「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数
题面描述
现在请求你维护一个数列,要求提供以下两种操作:
1、 查询操作。
语法:Q L
功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。
限制:L不超过当前数列的长度。(L>0)
2、 插入操作。
语法:A n
功能:将nnn加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。
限制:nnn是整数(可能为负数)并且在长整范围内。
注意:初始时数列是空的,没有一个数。
输入格式
第一行两个整数,M 和 D,其中 M 表示操作的个数,D 如上文中所述。
接下来的 M 行,每行一个字符串,描述一个具体的操作。语法如上文所述。
输出格式
对于每一个查询操作,你应该按照顺序依次输出结果,每个结果占一行。
样例
样例输入
5 100
A 96
Q 1
A 97
Q 1
Q 2
样例输出
96
93
96
解法1:线段树
没啥可说的,线段树基础题,细节见代码
/*#!/bin/sh
dir=$GEDIT_CURRENT_DOCUMENT_DIR
name=$GEDIT_CURRENT_DOCUMENT_NAME
pre=${name%.*}
g++ -O2 $dir/$name -o $pre -g -Wall -std=c++11
if test $? -eq 0; then
    gnome-terminal -x bash -c "time $dir/$pre;echo;read;"
fi*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=2e5+5,INF=0x3f3f3f3f;
int m,mol;
inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
	return s*w;
}
int tree[maxn*2];
void pushup(int rt){
	 tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);
}
void modify(int rt,int l,int r,int x,int w){
	if(l==r){
		tree[rt]+=w;return;
	}
	int mid=(l+r)/2;
	if(x<=mid)modify(rt*2,l,mid,x,w);
	else modify(rt*2+1,mid+1,r,x,w);
	pushup(rt);
}
int query(int rt,int l,int r,int s,int t){
	if(s<=l&&r<=t){
		return tree[rt];
	}
	int mid=(l+r)/2,ans=0;
	if(s<=mid)ans=max(ans,query(rt*2,l,mid,s,t));
	if(t>mid)ans=max(ans,query(rt*2+1,mid+1,r,s,t));
	return ans;
}
int main(){
freopen("a.in","r",stdin);
	m=read(),mol=read();
	int now=0,last=0;
	for(int i=1;i<=m;i++){
		char str;
		int x;
		cin>>str>>x;
		if(str=='A'){
			modify(1,1,m,++now,(x+last)%mol);//动态建树
		}else {
			last=query(1,1,m,now-x+1,now);
			cout<<last<<endl;
		}
	}
}
解法2:树状数组
#include <bits/stdc++.h>
const int maxn = 2e5+10;
int m,cnt;
int D,last,c[maxn];
int lowbit(int x) {return x&(-x);}
void update(int i,int value){//向下更新
	for(;i;i-=lowbit(i))
		c[i]=std::max(c[i],value);
}
int query(int i){//向上查询
    int res = 0;
    for(;i<=m;i+=lowbit(i))//m次操作最多有m个数,m之上就不用查询了
    	res=std::max(res,c[i]);
    return res;
}
void Solve(){
	scanf("%d%d",&m,&D);
    for(int i=1;i<=m;i++){
    	char s[2];int x;
        scanf("%s%d",s,&x);
        if(s[0]=='A'){
            cnt++;
            update(cnt,(x+last)%D);
        }
        else{
            last = query(cnt-x+1);
            printf("%lld\n",last);
        }
    }
}
int main(){
    Solve();
    return 0;
}
(假装是自己的代码)
解法3:单调栈
/*#!/bin/sh
dir=$GEDIT_CURRENT_DOCUMENT_DIR
name=$GEDIT_CURRENT_DOCUMENT_NAME
pre=${name%.*}
g++ -O2 $dir/$name -o $pre -g -Wall -std=c++11
if test $? -eq 0; then
    gnome-terminal -x bash -c "time $dir/$pre;echo;read;"
fi*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=2e5+5,INF=0x3f3f3f3f;
int m,mol,n,q[maxn],head,tail,id[maxn];
inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
	return s*w;
}
void Add(int x){
	while(q[tail]<=x&&tail)tail--;//最后一个大于前面的数,前面的稍小的数就没用了,这样也可以保证序列的单调性,才能二分
	q[++tail]=x;id[tail]=++n;
}
int query(int x){
	int key=n-x+1;//正序
	return q[lower_bound(id+head,id+tail+1,key)-id];//二分找到第一个大于key的位置
}
int main(){
freopen("a.in","r",stdin);
	m=read(),mol=read();
	int now=0,last=0;
	head=1;
	tail=0;
	for(int i=1;i<=m;i++){
		char str;
		int x;
		cin>>str>>x;
		if(str=='A'){
			Add((x+last)%mol);
		}else {
			last=query(x);
			cout<<last<<endl;
		}
	}
}
												
											「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数的更多相关文章
- 洛谷P1198 [JSOI2008]最大数(单点修改,区间查询)
		
洛谷P1198 [JSOI2008]最大数 简单的线段树单点问题. 问题:读入A和Q时,按照读入一个字符会MLE,换成读入字符串就可以了. #include<bits/stdc++.h> ...
 - 【题解】洛谷P1198 [JSOI2008] 最大数(线段树)
		
洛谷P1198:https://www.luogu.org/problemnew/show/P1198 思路 一道水水的线段树 20分钟A掉 这道题只涉及到单点修改和区间查询 所以这道题甚至不用Laz ...
 - 洛谷 P1198 [JSOI2008]最大数——单调栈/线段树
		
先上一波题目 https://www.luogu.org/problem/P1198 题目要求维护后缀最大值 以及在数列的最后面添加一个数 这道题呢我们有两种做法 1.单调栈 因为只需要维护后缀最大值 ...
 - 洛谷P1198 [JSOI2008]最大数(线段树)
		
题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:LLL不超过当前数列的长度.(L> ...
 - 洛谷P1198 [JSOI2008]最大数(线段树/单调栈)
		
题目链接: https://www.luogu.org/problemnew/show/P1198 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询 ...
 - 洛谷 P1198 [JSOI2008]最大数 Label:线段树
		
题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度. 2. 插入操作 ...
 - 最大数maxnumber (HYSBZ 1012)(线段树区间查询和单点修改)(优雅的暴力)
		
Problem 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L 个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插入操作 ...
 - 2020牛客寒假算法基础集训营2 J.求函数  (线段树 推公式 单点修改 区间查询)
		
https://ac.nowcoder.com/acm/contest/3003/J 题解: #include<bits/stdc++.h> typedef long long ll; u ...
 - 线段树_区间加乘(洛谷P3373模板)
		
题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 输入格式: 第一行包含三个整数N.M.P,分别表示该数列数字 ...
 
随机推荐
- java实现第九届蓝桥杯整理玩具
			
整理玩具 小明有一套玩具,一共包含NxM个部件.这些部件摆放在一个包含NxM个小格子的玩具盒中,每个小格子中恰好摆放一个部件. 每一个部件上标记有一个0~9的整数,有可能有多个部件标记相同的整数. 小 ...
 - Spring AOP概念及作用
			
一:SpringAOP概念 面向切面编程(Aspect Oriented Programming)提高了另一种角度来思考程序的结构,通过预编译方式和运行期间的动态代理实现程序功能的统一维护的一种技术. ...
 - tensorflow2.0学习笔记第一章第二节
			
1.2常用函数 本节目标:掌握在建立和操作神经网络过程中常用的函数 # 常用函数 import tensorflow as tf import numpy as np # 强制Tensor的数据类型转 ...
 - MySQL数据库字符集和排序规则的四个级别
			
MySQL数据库字符集和排序规则有四个级别的默认设置:服务器,数据库,表和列. 最初,服务器字符集和排序规则取决于启动mysqld时使用的选项.可以使用 --character-set-server该 ...
 - 如何使用PHP生成图片
			
/** * 从图片文件创建Image资源 * @param $file 图片文件,支持url * @return bool|resource 成功返回图片image资源,失败返回false */ fu ...
 - Nice Jquery Validator  DOM 绑定
			
针对表单的绑定 示例:在 form 上绑定 data-validator-option 来配置参数 <form data-validator-option='{stopOnError:false ...
 - rsyslog日志收集器
			
rsyslog详解(思维导图) 1. 日志收集概述 1.1 日志记录 时间 事件 1.2 日志收集器 syslog rsyslog elk stack 1.3 日志文件 文件记录的日志格式 其他日志文 ...
 - Flume-0.9.4和Hbase-0.96整合
			
这几天由于项目的需要,需要将Flume收集到的日志插入到Hbase中,有人说,这不很简单么?Flume里面自带了Hbase sink,可以直接调用啊,还用说么?是的,我在本博客的<Flume-1 ...
 - log报错的原因解决
			
idea未装lombok的插件: 1.用快捷键Ctrl+Alt+S打开:Settings→Plugins→Browse repositories 2.输入lom后选择Install,安装插件 3.按照 ...
 - springboot整合Mybatis(有xml)
			
pom.xml <!-- mybatis 支持 SpringBoot --> <dependency> <groupId>org.mybatis.spring.bo ...