principal

<button class="purple" data&#45;v&#45;c91880aa="">已经提交</button> <button class="purple" data&#45;v&#45;c91880aa="">已经通过</button>

23.66%

Total Submission:131

Total Accepted:31

题目描述

 

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

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

1.一个空的字符串是一个合法的文档。

2.如果A,B都是合法的文档,那么AB也是合法的文档。

3.如果S是合法的文档,那么aSb也是合法的文档,其中a,b是同一种括号,并且a是左括号,b是右括号。

现在给出qq个询问,每次询问只考虑文档第ll至rr个字符的情况下,文档是不是合法的。

 

 
 

输入描述

 

第一行两个整数n,m,q(1 \le n,m,q \le 10^6)n,m,q(1n,m,q106)。

第二行有nn个空格隔开的整数xx,第i个整数x_i(0 \le x_i &lt; m*2)xi(0xi<m2)代表文档中的第ii个字符是第\lfloor \frac{x}{2} \rfloor2x⌋种括号。另外,如果x_ixi是偶数,它代表一个左括号,否则它代表一个右括号。

接下来qq行,每行两个空格隔开的整数l,r(1 \le l \le r \le n)l,r(1lrn),代表询问第ll至rr个字符构成的字符串是否是一个合法的文档。

 

输出描述

 

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

 

样例输入 1 

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

样例输出

Ye

No

No

题意:
思路:既然L-R是一个合法的文档,那么即L~R这个子文档的括号都是合法匹配的,那么我们可以对整个文档进行预处理,
处理出到第i个位置有多少个括号没匹配成功。记array: L 那么如果第L[l-1]的值等于L[r]即可以说明l~r是一个合法文档
因为L[l-1]==L[r] ,那么即代表l~r这段中都自我抵消掉了(即匹配完成了)。
细节见代码:
#include<bits/stdc++.h> 
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=1000010;
int a[maxn],q[maxn],L[maxn],top,N,M,Q;
int main(){
    scanf("%d%d%d",&N,&M,&Q);
    rep(i,1,N) scanf("%d",&a[i]);
    rep(i,1,N) {
        if(!top) q[++top]=i;
        else {
            if(a[i]/2==a[q[top]]/2&&a[i]==a[q[top]]+1) top--;
            else q[++top]=i;
        }
        L[i]=q[top];
    }
    rep(i,1,Q){
        int x,y;
        scanf("%d%d",&x,&y);
        if((y-x)&1){
            if(L[y]==L[x-1]) puts("Yes");
            else puts("No");
        }
        else puts("No");
    }
    return 0;
}