BZOJ1012:[JSOI2008]最大數
阿新 • • 發佈:2019-01-17
blog () mat http ble name define using fin
淺談棧:https://www.cnblogs.com/AKMer/p/10278222.html
題目傳送門:https://lydsy.com/JudgeOnline/problem.php?id=1012
因為詢問的是最大值,我們可以考慮把”在更後面有比這個數大的數“的數刪掉。
那麽就是單調棧維護了,然後對於後面\(limit\)個數字裏最大值可以在棧上二分這個位置。
時間復雜度:\(O(n)\)
空間復雜度:\(O(n)\)
代碼如下:
#include <cstdio> #include <algorithm> using namespace std; typedef pair<int,int> pii; #define ff first #define ss second const int maxn=2e5+5; char opt[5]; pii stk[maxn]; int top,n,lstans,pps,cnt; int read() { int x=0,f=1;char ch=getchar(); for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1; for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0'; return x*f; } int main() { n=read(),pps=read(); for(int i=1;i<=n;i++) { scanf("%s",opt+1); if(opt[1]=='Q') { int limit=read(); int l=1,r=top; while(l<r) { int mid=(l+r)>>1; if(stk[top].ss-stk[mid].ss+1<=limit)r=mid; else l=mid+1; } lstans=stk[r].ff; printf("%d\n",lstans); } else { int x=(read()+lstans)%pps; while(top&&stk[top].ff<=x)top--; stk[++top]=make_pair(x,++cnt); } } return 0; }
BZOJ1012:[JSOI2008]最大數