principal


已经提交 已经通过


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(1≤n,m,q≤106)。

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

接下来qq行,每行两个空格隔开的整数l,r(1 \le l \le r \le n)l,r(1≤l≤r≤n),代表询问第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;
}