zoukankan      html  css  js  c++  java
  • [JZOJ427] 圣章-精灵使的魔法语

    Description

    【题目描述】
      “伦福萨”【即" ( "】和“密西卡”【即" ) "】是两种不同的精灵咒语,已知一个成功的咒语符合如下的规定:
      每一个密西卡之前都可以对应匹配到一个伦福萨,即为一个合法的精灵魔法咒语。
      方便的是,我们将“伦福萨”视为" ( ",“密西卡”视为" ) ",合法的精灵魔法咒语即为一个合法的括号序列。
      如:" ( ( ( ) ) ) "" ( ( ) ( ) ) "" ( ) ( ) ( ) "均为合法的魔法咒语," ) ( "" ( ) ) ( "" ( ( "均为不合法的魔法咒语。
      现在弗洛莉给我一个长长的“伦福萨”【即" ( "】和“密西卡”【即" ) "】的片段,每次给我一个l和r,让我判断需要在这个片段前最少添多少个“伦福萨”【即" ( "】,以及最少添多少个“密西卡”【即" ) "】可以成为一个合法的魔法咒语,更令人不爽的是,弗洛莉有的时候还会把一个“伦福萨”【即" ( "】变成“密西卡”【即" ) "】,或把一个“密西卡”【即" ) "】变为“伦福萨”【即" ( "】。

    Input

      第一行两个正整数n,m,表示我现在含有的咒语元素(“伦福萨”【即" ( "】和“密西卡”【即" ) "】)的个数以及弗洛莉给我的任务个数,
      第二行包含n个字符(“伦福萨”【即" ( "】或“密西卡”【即" ) "】)表示一开始弗洛莉给我的咒语片段。
      以下m行包括两种任务:
      Change x,表示弗洛莉将位置为x上的咒语片段进行一次变换(原来是“伦福萨”【即" ( "】变为“密西卡”【即" ) "】,原来是“密西卡”【即" ) "】变为“伦福萨”【即" ( "】)。
      Query l r,询问从l到r的区间的片段,在这个片段前最少添上多少个伦福萨”【即" ( "】,在这个片段后最少添上多少个“密西卡”【即" ) "】可以成为合法的魔法序列。

    Output

      每个询问对应一行答案,每行包括两个整数,表示在这个片段前最少添上多少个伦福萨”【即" ( "】,在这个片段后最少添上多少个“密西卡”【即" ) "】可以成为合法的魔法序列。

    Sample Input

      6 4
      (()()(
      Query 1 3
      Query 3 6
      Change 6
      Query 1 6

    Sample Output

      0 1
      1 1
      0 0
      【样例解释】
      1.片段为“ ( ( ) ”最右边填1个 ) 即可。
      2.片段为“ ) ( ) ( ”最左边添1个 ( 最右边添1个 ) 即可。
      3.片段为“ ( ( ) ( ) ) ”已经是合法片段。不需添加。

    Data Constraint

      对于20%的数据,1 ≤ n,m ≤ 100
      对于40%的数据,1 ≤ n,m ≤ 3000
      另外含有30%的数据,数据中不包含修改操作。
      对于100%的数据,1 ≤ n,m ≤ 150,000

    Summary

      建立一棵线段树,记录这段区间中多余的”(“和”)“,更新一个区间时:[x表示多余的”(“,y表示多余的”)“]

    1. x[w]=x[w*2+1]+max(0,x[w*2]-y[w*2+1])
    2. y[w]=y[w*2]+max(0,y[w*2+1]-x[w*2])

    code

     

      1 var
      2   l,r,h,g:array[1..2000000] of longint;
      3   a:array[1..200000] of char;
      4   n,m,i,j,c,v:longint;
      5   ch:char;
      6 procedure bb(w,x,y:longint);
      7 var
      8   mid:longint;
      9 begin
     10   l[w]:=x;
     11   r[w]:=y;
     12   if (x=y) then
     13     begin
     14       if a[x]='(' then
     15         inc(h[w])
     16       else inc(g[w]);
     17       exit;
     18     end;
     19   mid:=(x+y) div 2;
     20   bb(w*2,x,mid);
     21   bb(w*2+1,mid+1,y);
     22   if h[w*2]<g[w*2+1] then
     23     begin
     24       h[w]:=h[w*2+1];
     25       g[w]:=g[w*2]+g[w*2+1]-h[w*2];
     26     end
     27   else
     28     begin
     29       h[w]:=h[w*2]+h[w*2+1]-g[w*2+1];
     30       g[w]:=g[w*2];
     31     end;
     32 end;
     33 procedure xw(w,x,y:longint);
     34 var
     35   mid:longint;
     36 begin
     37   mid:=(l[w]+r[w]) div 2;
     38   if (l[w]=x)and(r[w]=y) then
     39     begin
     40       if (c<g[w]) then
     41         begin
     42           v:=v+g[w]-c;
     43           c:=h[w];
     44         end
     45       else
     46         c:=c+h[w]-g[w];
     47       exit;
     48     end;
     49     if x>mid then
     50       xw(w*2+1,x,y)
     51     else
     52     if y<=mid then
     53       xw(w*2,x,y)
     54     else
     55       begin
     56         xw(w*2,x,mid);
     57         xw(w*2+1,mid+1,y);
     58       end;
     59 end;
     60 procedure gg(w,y:longint);
     61 var
     62   mid:longint;
     63 begin
     64   mid:=(l[w]+r[w]) div 2;
     65   if l[w]=r[w] then
     66     begin
     67       if h[w]<>0 then
     68         begin
     69           h[w]:=0;
     70           g[w]:=1;
     71         end
     72       else
     73         begin
     74           h[w]:=1;
     75           g[w]:=0;
     76         end;
     77       exit;
     78     end;
     79   if y<=mid then
     80     gg(w*2,y);
     81   if y>mid then
     82     gg(w*2+1,y);
     83   if h[w*2]<g[w*2+1] then
     84     begin
     85       h[w]:=h[w*2+1];
     86       g[w]:=g[w*2]+g[w*2+1]-h[w*2];
     87     end
     88   else
     89     begin
     90       h[w]:=h[w*2]+h[w*2+1]-g[w*2+1];
     91       g[w]:=g[w*2];
     92     end;
     93 end;
     94 var
     95   x,y:longint;
     96 begin
     97   assign(input,'elf.in');reset(input);
     98   assign(output,'elf.out');rewrite(output);
     99   readln(n,m);
    100   for i:=1 to n do
    101     read(a[i]);
    102   readln;
    103   bb(1,1,n);
    104   for i:=1 to m do
    105     begin
    106       read(ch);
    107       if ch='Q' then
    108         begin
    109           for j:=1 to 5 do read(ch);
    110           readln(x,y);
    111           c:=0;v:=0;
    112           xw(1,x,y);
    113           writeln(v,' ',c);
    114         end;
    115       if ch='C' then
    116         begin
    117           for j:=1 to 5 do read(ch);
    118           readln(x);
    119           gg(1,x);
    120         end;
    121     end;
    122   close(input);close(output);
    123 end.
    View Code

     

     

  • 相关阅读:
    PHP生成xml 无法识别或是无法读取或是浏览器不识别等问题
    关于PHP 采集类
    Centos7 下安装Docke
    Git使用之设置SSH Key
    yii2.0中Rbac 怎么添加超加管理员
    Undefined index: HTTP_RAW_POST_DATA的解决办法
    window下phpstudy的nginx配置虚拟主机
    yii2.0中添加二维数组,多条数据。
    预防onion比特币勒索病毒,如何快速关闭135,137,138,139,445端口
    github与git之间怎么建立连接
  • 原文地址:https://www.cnblogs.com/Tokisaki-Kurumi/p/9315954.html
Copyright © 2011-2022 走看看