Princess Principal(模拟栈)

                                        Princess Principal

                                                                      时间限制: 2 Sec  内存限制: 1024 MB
                                                                                   提交: 188  解决: 37 
                                                                     [提交] [状态] [讨论版] [命题人:admin]

题目描述

阿尔比恩王国(the Albion Kingdom)潜伏着一群代号“白鸽队(Team White Pigeon)”的间谍。在没有任务的时候,她们会进行各种各样的训练,比如快速判断一个文档有没有语法错误,这有助于她们鉴别写文档的人受教育程度。

这次用于训练的是一个含有n个括号的文档。括号一共有mm种,每种括号都有左括号和右括号两种形式。我们定义用如下的方式定义一个合法的文档:

1.一个空的字符串是一个合法的文档。
2.如果A,B都是合法的文档,那么AB也是合法的文档。
3.如果S是合法的文档,那么aSb也是合法的文档,其中a,b是同一种括号,并且a是左括号,b是右括号。
现在给出q个询问,每次询问只考虑文档第ll至rr个字符的情况下,文档是不是合法的。

输入

第一行两个整数n,m,q(1≤n,m,q≤106)。
第二行有n个空格隔开的整数x,第i个整数xi(0≤xi<m∗2)代表文档中的第i个字符是第⌊x/2⌋种括号,且如果xi是偶数,它代表一个左括号,否则它代表一个右括号。
接下来q行,每行两个空格隔开的整数l,r(1≤l≤r≤n),代表询问第l至r个字符构成的字符串是否是一个合法的文档。

输出

输出共q行,如果询问的字符串是一个合法的文档,输出"Yes",否则输出"No"。

样例输入

6 4 3
0 2 3 1 4 7
1 4
1 5
5 6

样例输出

Yes
No
No

                                                                 [提交]           [状态]

 思路:模拟栈的操作,s数组表示栈 tot表示栈顶下标  遇到左括号其下标入栈遇到右括号并且前面当前栈顶元素与匹配出栈

(a[s[tot]]/2==a[i]/2 && a[s[tot]]==a[i]-1  前半句表示是否为同一类括号 后半句表示此括号与栈顶括号是否匹配 )

并用ans数组存储结果 最终ans数组存的是下标元素 左括号和没有与其匹配的右括号存储其下标 右括号存储的是与其对应的左括号的下标-1

所以判断 成立的条件是 !(r==l  && (r-l)%2) &&  ans[l-1]==ans[r]

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3fLL
#define pi acos(-1.0)
#define ms(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;

const int maxn = 1e6+5;

int l,r;
int n,m,q;
int a[maxn];
int ans[maxn];
int s[maxn],tot;


int main()
{
    tot = 0;
    scanf("%d%d%d", &n,&m,&q);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
    {
        if(tot && a[s[tot]]/2==a[i]/2 && a[s[tot]]==a[i]-1) tot--;
        else s[++tot] = i;
        //cout<<"\\"<<s[i]<<"///";
        ans[i]=s[tot];
        //cout<<ans[i]<<"---";
    }
    
    while(q--)
    {
        scanf("%d%d",&l,&r);
        if(r==l && (r-l)%2==1) puts("No");
        else if(ans[l-1]==ans[r]) puts("Yes");
        else puts("No");
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41021816/article/details/82961829