10.1牛客J題

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;
}
相關文章
相關標籤/搜索