10.1牛客J题
https://www.nowcoder.com/acm/contest/201/J
Description:
给你一行括号,定义了括号合格的形式,然后Q次询问,问你这个区间内括号是否合格
Solution:
利用栈模拟,栈内记录括号的编号,如果新来的括号可以匹配栈顶元素的括号,那么就弹出,否则入栈,用一个数组L记录每个括号
完成匹配后对应的括号编号(所以括号编号是唯一的)
最后对于询问l,r,这个区间里数的个数必须要是偶数,然后,L[R] == L[l-1]才可以,这个表示该区间前面的能消的消去后所对应的第一个id,等于该区间最右边能消的消去后对应的id,id唯一所以这个区间一定可以消完~,而且不会用到区间外的括号,如果用到区间外的括号就不会等于L[l-1]啦
#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; }