BZOJ 1012 最大数maxnumber

       题目简单,理解没问题,单用暴力也能得不少分数。因此方法很多,最容易想的是在暴力上优化,用二分的方式也能过,但方法还是略麻烦,所以要用到单调队列、单调栈。在这里我用的是单调队列。

       根据题目可知,进行的操作只有两个,一个增加数,一个输出最大值。因此首先要有一个数组记录当前的队列,然后需要一个单调队列记录最大值,便于查找最大值时的简便。对于什么是单调栈,在这里简单举一例说明:若有一列数 1,5,6,2,4,3,1。将其进行单调递减的排列,则:一个数时——1,两个数时——5,三个数时——6,四个数时——6,2,五个数时——6,4,六个数时——6,4,3,七个数时——6,4,3,1。题目中的一些细节注意一下就能A啦。

       方法很多,视情况而定,如有不懂单调栈、单调队列的查百度。(地址:http://baike.baidu.com/link?url=u4hRLKsFmBCcIldHxh6cqy8qGsGJhs68nI9k_d3nxL3lEBTX_LWyosNHbcjO-JGJ_L4S6EW3Wn6Qvet54dEeHqhttp://baike.baidu.com/link?url=6gqFWC4raDbhkACSHIZTbEwz7rTjXQs__Pnq23m835Qv2EkgI1Y1--LX1ouD2T6NzVnOykiNYhCvsuwoJAXnJq

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<string>

using namespace std;

int i_caozuo,i_mo;//操作数,取模的值。 
int i_shuzu[200001],i_temp,i_max[200001];//数组中的数,存进的数量,单调队列(递减) 
int i_last=0,i_shuru;//上次计算的结果,输入的值。 
char i_panduan[1];//输入的判断字符。 
int main()
{
    scanf("%d%d", &i_caozuo, &i_mo);//输入操作数及模。 
    while (i_caozuo--)//用while循环进行每次操作。 
    {
        scanf("%s%d",q,&i_shuru);//数组操作判断及数值。 
        if(i_panduan[0]=='A')//若判断为'A',则进行数组的增加操作。 
       {
            i_shuzu[++i_temp]=(i_last+i_shuru)%i_mo;//就新增加的值。 
            for(int i=i_temp;i;i--)
           {
               if(i_max[i]<i_shuzu[i_temp])i_max[i]=i_shuzu[i_temp];
              //单调队列进行判断使max数组始终单调减。
               else break;
           }
       }
       else printf("%d\n",i_last=i_max[i_temp-i_shuru+1]);
       //若判断为'Q',则进行输出操作。同时记录本次输出值。 
}
    return 0;
}

posted @ 2015-07-04 08:55  wlxy  阅读(323)  评论(2编辑  收藏  举报