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 < 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;
}