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_L4S6EW3Wn6Qvet54dEeHq,http://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; }