Problem 现在请求你维护一个数列,要求提供以下两种操作:1、 查询操作。语法:Q L 功能:查询当前数列中末尾L

个数中的最大的数,并输出这个数的值。限制:L不超过当前数列的长度。2、 插入操作。语法:A n 功能:将n加

上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取

模,将所得答案插入到数列的末尾。限制:n是非负整数并且在长整范围内。注意:初始时数列是空的,没有一个

数。

Input 第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足D在longint内。接下来

M行,查询操作或者插入操作。

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

Sample Input                                                                           Sample Output

5  100    A 96   Q 1   A 97   Q 1   Q 2                                        96  93  96

题解:简单的线段树模板题,建一颗空树逐个更新最大值就可以了,或者直接储存一个后缀里面最大数,每次更新,加上break,复杂度在不卡数据的时候还可以。

1、线段树

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int MAX = 200000;
struct node
{
int l, r;
int w;
};
struct node tree[MAX *4 + 10];
int a[MAX] = {0};
int ans = 0;
void BuildTree(int l, int r, int k)
{
tree[k].l = l;
tree[k].r = r;
if(l == r)
{
tree[k].w = a[l];
return ;
}
int m = (tree[k].l + tree[k].r) >> 1;
BuildTree(l, m,k << 1);
BuildTree(m + 1, r, k << 1 | 1);
tree[k].w = max(tree[k << 1].w, tree[k << 1 | 1].w);
}
void SingleModify(int k, int x, int y)
{
if(tree[k].l == x && tree[k].r == x)
{
tree[k].w = y;
return ;
}
int m = (tree[k].l + tree[k].r) / 2;
if(x <= m) SingleModify(k<<1,x,y);
else SingleModify(k<<1|1,x,y);
tree[k].w = max(tree[k<<1].w, tree[k<<1|1].w);
}
void IntervalQuery(int k, int x, int y)
{
if(tree[k].l >= x && tree[k].r <= y)
{
ans = max(ans,tree[k].w);
return ;
}
int m = (tree[k].l + tree[k].r) >>1;
if(x <= m) IntervalQuery(k<<1,x,y);
if(y > m) IntervalQuery(k <<1 |1,x, y);
}
char op;
int main()
{
int M, D, t, L, n, x, top;
while(~scanf("%d %d",&M, &D))
{
BuildTree(1,MAX,1);
t = 0;
top = 0;
while(M --)
{
getchar();
scanf("%c %d",&op, &x);
if(op == 'A')
{
n = x;
n = (n + t) % D;
SingleModify(1,top + 1,n);
top ++;
}
else
{
L = x;
ans = 0;
IntervalQuery(1,top - L + 1, top);
t = ans;
printf("%d\n",ans);
}
}
}
return 0;
}

2、优雅的暴力(复杂度在最坏情况下会TLE,不过不卡数据还可以)

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
ll a[N]; // 储存所有数据
ll b[N]; // 存储后缀的最大值,b[i]表示后i个数的最大值
int main()
{
ll m,mod,n,x,y,i,j,k,f; // x是查询后保留值
char op;
while(~scanf("%lld %lld", &m, &mod))
{
i = 1; j = 1; k = 0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
x = 0; f = 0;
for(ll p = 1; p <= m; p ++)
{
getchar();
scanf("%c %lld", &op, &n);
if(op == 'A')
{
if(f == 0) // 一直是添加的情况,当前没有查询,一旦查询之后就需要Mod
{
y = n % mod;
a[i ++] = y;
b[j ++] = y;
if(a[i - 1] <= a[i - 2]); //如果新添加的这个数比倒数第二个小,不需要更新
else
{
for(k = i - 2; k >= 0; k --) // 从后面开始更新
{
if(y > b[k])b[k] = y;
else break;
}
}
}
else
{
y = (n + x) % mod;
a[i ++] = y;
b[j ++] = y;
if(a[i - 1] <= a[i - 2]);
else
{
for(k = i - 2; k >= 0; k --)
{
if(y > b[k])b[k] = y;
else break;
}
}
}
}
else if(op == 'Q') // 访问情况, 保留x
{
f = 1;
x = b[j - n];
printf("%lld\n",x);
}
}
}
return 0;
}

最大数maxnumber (HYSBZ 1012)(线段树区间查询和单点修改)(优雅的暴力)的更多相关文章

  1. HDU 1754 I Hate It(线段树区间查询,单点更新)

    描述 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老 ...

  2. 「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数

    「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数 题面描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数, ...

  3. BZOJ 1012: [JSOI2008]最大数maxnumber 单调队列/线段树/树状数组/乱搞

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 4750  Solved: 2145[Submi ...

  4. 2020牛客寒假算法基础集训营2 J.求函数 (线段树 推公式 单点修改 区间查询)

    https://ac.nowcoder.com/acm/contest/3003/J 题解: #include<bits/stdc++.h> typedef long long ll; u ...

  5. 约会安排 HDU - 4553(线段树区间查询,区间修改,区间合并)

    题目: 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑, ...

  6. ACM_最值差(线段树区间查询最值)

    最值差 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定N个数A1A2A3A4...AN.求任意区间Ai到Aj中的最大数与最小 ...

  7. POJ_3468 A Simple Problem with Integers 【线段树区间查询+修改】

    一.题目 POJ3468 二.分析 裸的线段树区间查询+修改. 三.AC代码 #include <cstdio> #include <iostream> #include &l ...

  8. hdu 1754 I Hate It (线段树功能:单点更新和区间最值)

    版权声明:本文为博主原创文章.未经博主同意不得转载.vasttian https://blog.csdn.net/u012860063/article/details/32982923 转载请注明出处 ...

  9. HDU.1556 Color the ball (线段树 区间更新 单点查询)

    HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...

随机推荐

  1. Java 反射理解(二)-- 动态加载类

    Java 反射理解(二)-- 动态加载类 概念 在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点: 不仅表示了类的类类型,还代表了动态加载类 编 ...

  2. java中的接口和php的接口的区别

    php: 规范: 接口是一种特殊的抽象类,这种抽象类中只包含抽象方法和静态常量. 在接口中的抽象方法只能是public的,默认也是public权限. abstract和final修饰符也不能修饰接口中 ...

  3. 排好序的数组中,找出两数之和为m的所有组合

    public static void main(String[] args) { int[] a = {1,2,2,3,3,4,5,6}; int m = 6; normal(a, m); } //正 ...

  4. 从无建立一个vue项目

    node.js安装 首先安装Node,官网地址 :https://nodejs.org/en/download/ ,进去下载关于符合自己电脑的下载. 具体的Node安装步骤参考地址: https:// ...

  5. ubuntu18.04安装fcitx

    fcitx安装比较麻烦,我每次安装都要费不少劲,每次装安之后都没有写日志记录下来,导致下次装的时候又手忙脚乱,所以这次一定要记录下来. 前因: 我本来用的是ibus,但是这个输入法好像有bug,我在编 ...

  6. php打包下载以及断点续传

    php下载单文件 以及 多文件打包下载,支持断点续传 断点续传的功能未经验证 需要nginx或者apache服务器指定静态文件,png, mp4, zip等后缀文件的目录, 直接实例化并调用 down ...

  7. ubuntu版本信息查看

    1.cat /etc/issue 2.cat /etc/lsb-release 3.uname -a 4.cat /proc/version 5.lsb_release -a 显卡信息1.lspci ...

  8. linux 计划任务超时控制和并发控制

    Linux crontab 的配置存放 /var/spool/cron 目录下. Linux crontab的日志文件存放再 /var/log/cron* timeout 命令 timeout 给脚本 ...

  9. P4149 距离为K的点对(最少边数) n=200000 点分治

    这题数据范围变成了200000 n^2就过不了 同时要求求的是最少的边数 不能容斥 #include<bits/stdc++.h> using namespace std; ; ; ], ...

  10. 转PostgreSQL 用游标优化的一个例子

    一位PG社区的朋友提到的一个应用场景,目前遇到性能问题. 数据结构大概是这样的,包含一个主键,一个数组,一个时间,其他字段. 请求分析: 有检索需求,比较频繁.查找数组中包含某些元素的记录,并按时间排 ...