zoukankan      html  css  js  c++  java
  • Parenthesis(前缀和+线段树)

    1809: Parenthesis

    Time Limit: 5 Sec     Memory Limit: 128 Mb     Submitted: 2291     Solved: 622    


    Description

    Bobo has a balanced parenthesis sequence P=p1 p2…pn of length n and q questions.
    The i-th question is whether P remains balanced after pai and pbi  swapped. Note that questions are individual so that they have no affect on others.
    Parenthesis sequence S is balanced if and only if:
    1. S is empty;
    2. or there exists balanced parenthesis sequence A,B such that S=AB;
    3. or there exists balanced parenthesis sequence S' such that S=(S').

    Input

    The input contains at most 30 sets. For each set:
    The first line contains two integers n,q (2≤n≤105,1≤q≤105).
    The second line contains n characters p1 p2…pn.
    The i-th of the last q lines contains 2 integers ai,bi (1≤ai,bi≤n,ai≠bi).

     

    Output

    For each question, output "Yes" if P remains balanced, or "No" otherwise.

    Sample Input

    4 2
    (())
    1 3
    2 3
    2 1
    ()
    1 2

    Sample Output

    No
    Yes
    No

    Hint

    Source

    湖南省第十二届大学生计算机程序设计竞赛

     

    //题意: n 长字符串,m次询问,一开始括号是匹配的,问 a ,b 位置的字符调换后,是否匹配

    //题解:网上很多的暴力超时代码没看懂,这题,如果,( 看成 1 ,) 看成 -1 ,其实就是求 a -- (b-1) 中前缀和最小的,在调换后是否能满足要求即可,写了个线段树求区间最小

      1 # include <cstdio>
      2 # include <cstring>
      3 # include <cstdlib>
      4 # include <iostream>
      5 # include <vector>
      6 # include <queue>
      7 # include <stack>
      8 # include <map>
      9 # include <bitset>
     10 # include <sstream>
     11 # include <set>
     12 # include <cmath>
     13 # include <algorithm>
     14 #pragma comment(linker,"/STACK:102400000,102400000")
     15 using namespace std;
     16 #define LL          long long
     17 #define lowbit(x)   ((x)&(-x))
     18 #define PI          acos(-1.0)
     19 #define INF         0x3f3f3f3f3f3f3f3f
     20 #define eps         1e-8
     21 #define MOD         1000000007
     22 
     23 inline int scan() {
     24     int x=0,f=1; char ch=getchar();
     25     while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
     26     while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
     27     return x*f;
     28 }
     29 inline void Out(int a) {
     30     if(a<0) {putchar('-'); a=-a;}
     31     if(a>=10) Out(a/10);
     32     putchar(a%10+'0');
     33 }
     34 #define MX 100005
     35 /**************************/
     36 struct Tree
     37 {
     38     int l,r;
     39     int m;
     40 }tree[MX*4];
     41 
     42 int st[MX];
     43 char str[MX];
     44 
     45 void build_tree(int l,int r,int k)
     46 {
     47     tree[k] = (Tree){l,r,0};
     48     if (l==r)
     49     {
     50         tree[k].m = st[l];
     51         return;
     52     }
     53     int mid = (l+r)/2;
     54     build_tree(l,mid,2*k);
     55     build_tree(mid+1,r,2*k+1);
     56     tree[k].m = min(tree[2*k].m,tree[2*k+1].m);
     57 }
     58 
     59 int inqy(int l,int r,int k)
     60 {
     61     if (l==tree[k].l&&r==tree[k].r)
     62         return tree[k].m;
     63 
     64     int mid = (tree[k].l+tree[k].r)/2;
     65     if (r<=mid) return inqy(l,r,2*k);
     66     else if (l>mid) return inqy(l,r,2*k+1);
     67     return min (inqy(l,mid,2*k) , inqy(mid+1,r,2*k+1));
     68 }
     69 
     70 int main()
     71 {
     72     int n,m;
     73     while (scanf("%d%d",&n,&m)!=EOF)
     74     {
     75         scanf("%s",str+1);
     76         st[0]=0;
     77         for (int i=1;i<=n;i++)
     78             st[i] = st[i-1] + (str[i]=='('?1:-1 );
     79         build_tree(1,n,1);
     80         while (m--)
     81         {
     82             int a = scan();
     83             int b = scan();
     84             if (a>b) swap(a,b);
     85 
     86             int ok=1;
     87 
     88             int sb = inqy(a,b-1,1);
     89             if (str[a]=='(') sb--;
     90             else sb++;
     91             if (str[b]==')') sb--;
     92             else sb++;
     93             if (sb<0) ok=0;
     94 
     95             if (ok)
     96                 printf("Yes
    ");
     97             else
     98                 printf("No
    ");
     99         }
    100     }
    101     return 0;
    102 }
    View Code
  • 相关阅读:
    Atitit. visual studio vs2003 vs2005 vs2008  VS2010 vs2012 vs2015新特性 新功能.doc
    Atitit. C#.net clr 2.0  4.0新特性
    Atitit. C#.net clr 2.0  4.0新特性
    Atitit.通过null 参数 反射  动态反推方法调用
    Atitit.通过null 参数 反射  动态反推方法调用
    Atitit..net clr il指令集 以及指令分类  与指令详细说明
    Atitit..net clr il指令集 以及指令分类  与指令详细说明
    Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL
    Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL
    Atitit.跨语言反射api 兼容性提升与增强 java c#。Net  php  js
  • 原文地址:https://www.cnblogs.com/haoabcd2010/p/7356289.html
Copyright © 2011-2022 走看看