Comet OJ 热身赛(K题)principal(括号匹配问题+stack模拟)
Posted qieqiemin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Comet OJ 热身赛(K题)principal(括号匹配问题+stack模拟)相关的知识,希望对你有一定的参考价值。
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} floor⌊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; }
以上是关于Comet OJ 热身赛(K题)principal(括号匹配问题+stack模拟)的主要内容,如果未能解决你的问题,请参考以下文章
Comet OJ - Contest #11 B usiness
Comet OJ - Contest #11 B- usiness