BZOJ 1012 最大数maxnumber(单调队列)

题意:给你一系列操作和询问,,和上题类似,只不过询问变成从队尾开始L个的最大值=-=

分析:这道题因为没人出队,所以不用判断数据是否过期。所以只需要维护一个单增队列(或者栈)

那么询问队尾前L个最大值的时候根据前面观点,队列里从前到后数据(进队顺序)一定是递增的

所以我们可以计数+二分位置来算。

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<string>#include<iostream>#include<queue>#include<cmath>#include<map>#include<stack>#include<set>using namespace std;#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )#define CLEAR( a , x ) memset ( a , x , sizeof a )const int INF=0x3f3f3f3f;typedef long long LL;const int maxn=1e6+100;int q[maxn],cnt,head,tail;int M,D;int t,n;int val[maxn];inline int BT(int x){int l=head,r=tail,mid,res;while(l<=r){mid=(l+r)>>1;if(x<=q[mid]) res=mid,r=mid-1;else l=mid+1;}return q[res];}int main(){char str[10];int x;while(~scanf("%d%d",&M,&D)){head=1,tail=0;int ans=0;cnt=0;while(M–){scanf("%s%d",str,&x);if(str[0]=='A'){val[++cnt]=(x+ans)%D;while(head<=tail&&val[q[tail]]<=val[cnt])–tail;q[++tail]=cnt;}else{ans=val[BT(cnt-x+1)];printf("%d\n",ans);}}}return 0;}/*5 100A 96Q 1A 97Q 1Q 2*/

看着书里九万五千公里的绚丽。又或是和我一样,

BZOJ 1012 最大数maxnumber(单调队列)

相关文章:

你感兴趣的文章:

标签云: