bzoj 1012 [JSOI2008]最大数maxnumber

Posted Narh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 1012 [JSOI2008]最大数maxnumber相关的知识,希望对你有一定的参考价值。

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1012

单调栈水题。可以用lower_bound。

但输入不要char ch; cin>>ch。会TLE。(为什么?)

技术分享图片
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+5;
int n,m,mod,stack[N],a[N],top,lst;
int main()
{
    scanf("%d%d",&m,&mod);
    char ch[5];int x;
    while(m--)
    {
        scanf("%s%d",ch,&x);
        if(ch[0]==A)
        {
            (x+=lst)%=mod;a[++n]=x;
            while(top&&x>=a[stack[top]])top--;
            stack[++top]=n;
        }
        if(ch[0]==Q)
        {
            int k=lower_bound(stack+1,stack+top+1,n-x+1)-stack;
            lst=a[stack[k]];
            printf("%d
",lst);
        }
    }
    return 0;
}
lower_bound
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=2e5+5;
int n,m,mod,stack[N],ps[N],top,lst;
int main()
{
    scanf("%d%d",&m,&mod);
    char ch[5];int x;
    while(m--)
    {
        scanf("%s%d",ch,&x);
        if(ch[0]==A)
        {
            (x+=lst)%=mod;
            while(top&&x>=stack[top])top--;
            stack[++top]=x;ps[top]=++n;
        }
        if(ch[0]==Q)
        {
            int l=1,r=top;
            while(l<=r)
            {
                int mid=((l+r)>>1);
                if(ps[mid]>n-x)lst=mid,r=mid-1;
                else l=mid+1;
            }
            lst=stack[lst];
            printf("%d
",lst);
        }
    }
    return 0;
}

 

以上是关于bzoj 1012 [JSOI2008]最大数maxnumber的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1012[JSOI2008]最大数maxnumber

BZOJ 1012: [JSOI2008]最大数maxnumber

BZOJ1012: [JSOI2008]最大数maxnumber [线段树]

单调栈 BZOJ1012 [JSOI2008]最大数maxnumber

BZOJ1012:[JSOI2008]最大数——题解

BZOJ 1012 [JSOI2008]最大数maxnumber