28PUSH 1QUERYPUSH 0REVERSEQUERYPOPPOPQUERY3PUSH 0REVERSEQUERYSample OutputCase #1:11Invalid.Case #2:0思路:双向队列存储0的位置。因为不管0前面的值为多少,碰到0就会变成1.然后看一下剩余的1的个数就可以了。
坑点:
1.双向队列首先要判空。直接算1的个数就可以了。
2.0前面没有值得情况。这时候0的1不计算。
#include <bits/stdc++.h>using namespace std;const int MAXN=4e5+7;const int inf=1e9;char s[10];int num[MAXN];int main(){ int i; int t; int n; int l,r; scanf("%d",&t); for(int tt=1; tt<=t; ++tt) { deque<int>q; scanf("%d",&n); printf("Case #%d:/n",tt); int x; l=r=200001; int flag=0; for(i=0; i<n; ++i) { scanf("%s",s); if(s[0]=='P') { if(s[1]=='U') { scanf("%d",&x); if(!flag) { num[r++]=x; if(!x)q.push_back(r-1); } else { num[--l]=x; if(!x)q.push_front(l); } } else { if(!flag) { r--; if(!num[r])q.pop_back(); } else { if(!num[l])q.pop_front(); l++; } } } else if(s[0]=='R')flag=(flag+1)%2; else if(s[0]=='Q') { if(l>=r)puts("Invalid."); else if(q.empty())printf("%d/n",(r-l)%2); else { int ans; if(r-l==1)printf("%d/n",num[l]); else { if(!flag) { ans=(q.front()-l+(q.front()!=r-1))%2; } else { ans=(r-q.back()-1+(q.back()!=l))%2; } printf("%d/n",ans); } } } } } return 0;}
新闻热点
疑难解答