Comet OJ 热身赛(K题)principal(括号匹配问题+stack模拟)

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

 

原文地址:https://www.cnblogs.com/qieqiemin/p/10290308.html

时间: 2024-10-14 04:31:50

Comet OJ 热身赛(K题)principal(括号匹配问题+stack模拟)的相关文章

一个算法题:括号匹配问题。

问:给予一个字符串为:']]][]]]][[[[[[]]]]',请写出程序求出其有多少对'[]'? 一般这种问题都是想让你通过数据结构去处理,仔细回想一下我们学过的数据结构,栈的先进后出是否能处理这个问题?将字符串遍历,遇到左方括号 '[' 时将其压入栈中,遇到右方括号 ']'时取出栈顶元素匹配,并将对数加1,这样最后我们就求出来能有多少对方括号了. 栈的示意图: 流程图: 通过分析,我们使用PHP编码实现这个功能: //括号匹配问题 $str = ']]][]]]][[[[[[]]]]'; /

算法题:括号匹配(小中大括号序列)

括号序列由( )[ ]{ }组成,不合法的括号序列由( { ) },[ } { ],等等.编程实现一个函数,检查一个括号序列是否是合法的括号序列. 解法: 思路和"后缀表达式的求解"相似.我们借助栈,每读一个括号,如果是左括号,那么入栈,然后继续读下一个括号:如果是右括号,那么就要看看这个右括号和栈顶的括号是否匹配:如果匹配,那么弹出栈顶的括号,继续读下一个括号.当栈变空时,说明此括号序列是合法的. public class Test05 { public static boolean

计蒜客 括号匹配(stack+map)

题意 蒜头君在纸上写了一个串,只包含'('和')'.一个'('能唯一匹配一个')',但是一个匹配的'('必须出现在')'之前.请判断蒜头君写的字符串能否括号完全匹配,如果能,输出配对的括号的位置(匹配的括号不可以交叉,只能嵌套). 输入格式 一行输入一个字符串只含有'('和')',输入的字符串长度不大于50000. 输出格式 如果输入括号不能匹配,输出一行"No",否则输出一行"Yes",接下里若干行每行输出 2 个整数,用空格隔开,表示所有匹配对的括号的位置(下标

POJ-2955 Brackets(括号匹配问题)

题目链接:http://poj.org/problem?id=2955 这题要求求出一段括号序列的最大括号匹配数量 规则如下: the empty sequence is a regular brackets sequence, if s is a regular brackets sequence, then (s) and [s] are regular brackets sequences, and if a and b are regular brackets sequences, th

【基础练习】【栈】【映射】codevs3543 括号匹配题解

本来这是一道水题,结果因为我有些大意,弄了一个小时···引以为戒. 这道题比较特殊的一点是四种括号如果存在嵌套必须按照一定的顺序嵌套. 放代码 //codevs3543 括号匹配 #include<stack> #include<cstring> #include<cstdio> #include<map> using namespace std; map<char,int> low; stack<char> s; int n; bo

栈的应用之括号匹配

思路: 在算法中设置一个栈,每读入一个空号 一:若是右括号: '}'  ' )'   ']'(两种情况): 1:使置于栈顶的最急迫的期待得以消解,需将栈顶元素出栈: 2:不合法的情况,即与栈顶的最急迫的期待不匹配,需将其(括号)压栈: 二:若是左括号:'('  '{'  '[' 作为一个新的更急迫的期待压栈: 顺序栈的代码不再赘述:点击打开链接 //括号匹配 #include"stack.h" int main() { Stack st; InitStack(&st); int

集训第五周动态规划 J题 括号匹配

Description We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a regular brackets sequence, if s is a regular brackets sequence, then (s) and [s] are regular brackets sequences, and if a and b are regul

POJ C程序设计进阶 编程题#4:括号匹配问题

编程题#4:扩号匹配问题 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 在某个字符串(长度不超过100)中有左括号.右括号和大小写字母:规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配.写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号.不能匹配的左括号用"$"标注,不能匹配的右括号用&quo

华为OJ:2199 判断输入字符串中的括号匹配

根据不同的括号有个计数器,在遍历时,当计数器小于0则返回false或者当遍历完后,计数器仍旧不为零,也返回false. import java.util.Scanner; public class bracketsMatch { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.nextLine(); int a=0; int b=0; int c=0; for