https://www.nowcoder.com/acm/contest/201/Jios
Description:
給你一行括號,定義了括號合格的形式,而後Q次詢問,問你這個區間內括號是否合格數組
Solution:
利用棧模擬,棧內記錄括號的編號,若是新來的括號能夠匹配棧頂元素的括號,那麼就彈出,不然入棧,用一個數組L記錄每一個括號spa
完成匹配後對應的括號編號(因此括號編號是惟一的)code
最後對於詢問l,r,這個區間裏數的個數必需要是偶數,而後,L[R] == L[l-1]才能夠,這個表示該區間前面的能消的消去後所對應的第一個id,等於該區間最右邊能消的消去後對應的id,id惟一因此這個區間必定能夠消完~,並且不會用到區間外的括號,若是用到區間外的括號就不會等於L[l-1]啦blog
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1e6 + 1e2; int A[maxn]; int stk[maxn],stkid; int l[maxn]; int main() { int n,m,q; while(~scanf("%d%d%d",&n,&m,&q)) { stkid = 0; int op; for(int i = 1;i <= n;++i) { scanf("%d",&A[i]); } for(int i = 1;i <= n;++i) { if(!stkid) { stk[++stkid] = i; } else { op = A[i]; int op2 = A[stk[stkid]]; if(op / 2 == op2 / 2 && op2 + 1 == op) { stkid--; } else { stk[++stkid] = i; } } l[i] = stk[stkid]; } int L,R; l[0] = 0; for(int i = 1;i <= q;++i) { scanf("%d%d",&L,&R); if((R-L) % 2 == 1) { if(l[L-1] == l[R]) printf("Yes\n"); else printf("No\n"); } else printf("No\n"); } } return 0; }