最大数——栈

洛谷        P1198 [JSOI2008]最大数

题目描述

现在请求你维护一个数列,要求提供以下两种操作:

1、 查询操作。

语法:Q L

功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。

限制:L不超过当前数列的长度。

2、 插入操作。

语法:A n

功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。

限制:n是整数(可能为负数)并且在长整范围内。

注意:初始时数列是空的,没有一个数。

输入输出格式

输入格式:

第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足(0<D<2,000,000,000)

接下来的M行,每行一个字符串,描述一个具体的操作。语法如上文所述。

输出格式:

对于每一个查询操作,你应该按照顺序依次输出结果,每个结果占一行。

输入输出样例

输入样例#1:

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

输出样例#1:

96
93
96

说明

[JSOI2008]

思路

模拟一个单调递减栈,(和上一题思路一致)如果后加入的书比他前面的数大,那就把这个数弹出栈,然后用二分答案的方法求最大值所在的区间。

其实这个题还可以用单调队列的在这里我就不详细说了

http://hzwer.com/1130.html

黄学长博客有

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 100000
#define maxn 123456
using namespace std;
int n,d,t,m;
char ch;
int top,stack[N],a[N],len;
/*
    维护一个递减栈的原因:
    考虑两个是ai和aj,如果i>j,并且ai>aj的话,
    那么我们可以发现j没有任何存在的意义了。
    因为如果aj可以作为最终答案的话,一定就会经过ai。
    然后就不可能选aj了。
*/
int main()
{
    scanf("%d%d",&n,&d);
    for(int i=1;i<=n;i++)
     {
         cin>>ch>>m;//不能使用 scanf("%c%d",&ch,&x);因为scanf( )读入换行,cin不读入换行!
         if(ch==‘A‘)//加入一个新点的情况
         {
             m=(m+t)%d;//t为上一次输出的最大的那个值
            a[++len]=m;//a[i]数组中直接存数
            while(top&&a[stack[top]]<=m) top--;
            stack[++top]=len;//stack[]中存单调递减+序列的数的编号
         }
        else
        {
        int l=1,r=top;
        while(l<r)
        {
            int mid=(l+r)/2;
            if(stack[mid]<len-m+1) l=mid+1;
            else r=mid;
        }
        int y=l;
        t=a[stack[y]];
        printf("%d\n",t);
        }
     }
    return 0;
}
时间: 2024-08-02 02:44:00

最大数——栈的相关文章

七方件业金离以提领前群约会ODjdidtlwfWv

为了从不同环节,尤其与广大使用人群直接关系的环节反映质量状况,对共享自行车投放点.运营仓库.生产企业等不同环节的产品抽查,覆盖了共享自行车从成品出厂到待投放的关键环节. 该负责人称,根据新车投放情况,结合共享自行车行业市场占有分布特点,本次重点抽查了摩拜.ofo.Hellobike三个品牌的产品,占本次抽查批次总数的83.3%.其中,在天津.无锡.武汉.广州.深圳.东莞6个城市抽查了9批次摩拜产品,占产品抽查批次总数的37.5%,抽查批次合格率88.9%,抽查不合格的1批次产品为待投放于广州市的

【单调栈】Bzoj 1012: 最大数maxnumber

1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 6255  Solved: 2676[Submit][Status][Discuss] Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. 插入操作.语法:A n 功能:将n加上t,其中t是最近一次

BZOJ 1012: [JSOI2008]最大数maxnumber 单调栈

单调栈 1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 4988  Solved: 2252 [Submit][Status][Discuss] Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. 插入操作.语法:A n 功能:将n加上t,其中

单调栈 BZOJ1012 [JSOI2008]最大数maxnumber

1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 10440  Solved: 4571[Submit][Status][Discuss] Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L 个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插入操作.语法:A n 功能:将n加 上t,其中t是最近一

[JSOI2008]最大数maxnumber(栈&amp;二分查找)

题目链接:1012: [JSOI2008]最大数maxnumber 题意 中文题,点链接看吧,就不copy了. 思路 打眼一看立刻就想到线段树,但本题的区间最值查找每次都是在查后L位,感觉用线段树有些大材小用了. 再仔细想想,发现,如果倒数第i个比倒数第i+1个数小,那么第i个数是没有用的,任意查询的最值都不会是它,因为查的是后L个嘛. 所以呢,我们我以维护一个栈,每次添加新元素时,将其与栈顶元素比较,若栈顶元素小,即无用了,那就出栈,否则,就将新元素入栈. 在查询时直接对栈里元素进行二分查找就

BZOJ1012 JSOI2008 最大数maxnumber 线段树/栈+二分法

题意:给定一个数列,要求维护:1.求倒数L个数中的最大值  2.在数列末尾插入(最近的1询问的答案+x)%D.其中初始序列为空. 法一:因为询问最多200000个,所以直接建一棵大小为M的线段树维护即可 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; struc

bzoj1012最大数maxnumber——单调栈

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1012 单调栈水题:用了一下lower_bound二分. 代码如下: #include<iostream> #include<cstdio> #include<algorithm> using namespace std; int m,d,len,a[200005],sta[200005],top,lst; char s[5]; int main() { scanf

Bzoj1012 最大数maxnumber

Time Limit: 3000MS   Memory Limit: 165888KB   64bit IO Format: %lld & %llu Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插入操作.语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得

寻找最大数(二)

寻找最大数(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给你一个数字n(可能有前缀0). 要求从高位到低位,进行 进栈出栈 操作,是最后输出的结果最大. 输入 有多组测试数据. 对于每组数据,输入一个n(0<=n<=10^100). 输出 输出栈操作后的结果. 样例输入 789 75948 样例输出 987 98457 提示 (用0表示进栈,1表示出栈) 789 输出 987 过程是 000111 75948 输出 98457 过程是 000100111