括号序列的经典做法
把(看成1,)看成-1
匹配的括号序列即任意前缀和都非负
我们先解决静态的问题,给定一段括号序列求最少修改次数
我们先找出最大后缀和a和最小前缀和b
之间一定可以不相交
显然a+|b|个括号是未匹配的
显然修改即为(|b|+1) div 2+(a+1) div 2;
由于序列的变化,我们用splay维护
由于涉及到括号反转我们还要维护左最大和右最小
然后就没了
这个是bzoj2329的代码

  1. var son:array[..,..] of longint;
  2. laz,lmax,rmax,lmin,rmin,size,sum,a,fa:array[..] of longint;
  3. cha,rev:array[..] of boolean;
  4. root,i,n,m,x,y,z,w:longint;
  5. ch:char;
  6. s:string;
  7.  
  8. function min(a,b:longint):longint;
  9. begin
  10. if a>b then exit(b) else exit(a);
  11. end;
  12.  
  13. function max(a,b:longint):longint;
  14. begin
  15. if a>b then exit(a) else exit(b);
  16. end;
  17.  
  18. procedure swap(var a,b:longint);
  19. var c:longint;
  20. begin
  21. c:=a;
  22. a:=b;
  23. b:=c;
  24. end;
  25.  
  26. procedure get(var a,b:longint);
  27. var c:longint;
  28. begin
  29. c:=a;
  30. a:=-b;
  31. b:=-c;
  32. end;
  33.  
  34. procedure update(x:longint);
  35. var l,r:longint;
  36. begin
  37. l:=son[x,];
  38. r:=son[x,];
  39. size[x]:=size[l]+size[r]+;
  40. sum[x]:=sum[l]+sum[r]+a[x];
  41. lmax[x]:=max(lmax[l],sum[l]+a[x]+lmax[r]);
  42. rmax[x]:=max(rmax[r],sum[r]+a[x]+rmax[l]);
  43. lmin[x]:=min(lmin[l],sum[l]+a[x]+lmin[r]);
  44. rmin[x]:=min(rmin[r],sum[r]+a[x]+rmin[l]);
  45. end;
  46.  
  47. procedure replace(x,w:longint);
  48. begin
  49. a[x]:=w;
  50. laz[x]:=w;
  51. cha[x]:=false;
  52. if w=- then
  53. begin
  54. sum[x]:=-size[x];
  55. lmax[x]:=;
  56. rmax[x]:=;
  57. lmin[x]:=sum[x];
  58. rmin[x]:=sum[x];
  59. end
  60. else begin
  61. sum[x]:=size[x];
  62. lmax[x]:=sum[x];
  63. rmax[x]:=sum[x];
  64. lmin[x]:=;
  65. rmin[x]:=;
  66. end;
  67. end;
  68.  
  69. procedure reverse(x:longint);
  70. begin
  71. swap(son[x,],son[x,]);
  72. swap(lmax[x],rmax[x]);
  73. swap(lmin[x],rmin[x]);
  74. rev[x]:=not rev[x];
  75. end;
  76.  
  77. procedure change(x:longint);
  78. begin
  79. a[x]:=-a[x];
  80. sum[x]:=-sum[x];
  81. get(lmax[x],lmin[x]);
  82. get(rmax[x],rmin[x]);
  83. cha[x]:=not cha[x];
  84. end;
  85.  
  86. procedure push(x:longint);
  87. var l,r:longint;
  88. begin
  89. l:=son[x,];
  90. r:=son[x,];
  91. if laz[x]<> then
  92. begin
  93. if l<>- then replace(l,laz[x]);
  94. if r<>- then replace(r,laz[x]);
  95. laz[x]:=;
  96. end;
  97. if cha[x] then
  98. begin
  99. if l<>- then change(l);
  100. if r<>- then change(r);
  101. cha[x]:=false;
  102. end;
  103. if rev[x] then
  104. begin
  105. if l<>- then reverse(l);
  106. if r<>- then reverse(r);
  107. rev[x]:=false;
  108. end;
  109. end;
  110.  
  111. function find(k:longint):longint;
  112. var p:longint;
  113. begin
  114. p:=root;
  115. while true do
  116. begin
  117. push(p);
  118. if size[son[p,]]+=k then exit(p);
  119. if size[son[p,]]+>k then p:=son[p,]
  120. else begin
  121. k:=k-size[son[p,]]-;
  122. p:=son[p,];
  123. end;
  124. end;
  125. end;
  126.  
  127. procedure rotate(x,w:longint);
  128. var y:longint;
  129. begin
  130. y:=fa[x];
  131. push(x);
  132. if fa[y]=- then root:=x
  133. else begin
  134. if son[fa[y],]=y then son[fa[y],]:=x
  135. else son[fa[y],]:=x;
  136. end;
  137. fa[x]:=fa[y];
  138. son[y,-w]:=son[x,w];
  139. if son[x,w]<>- then fa[son[x,w]]:=y;
  140. son[x,w]:=y;
  141. fa[y]:=x;
  142. update(y);
  143. end;
  144.  
  145. procedure splay(x,f:longint);
  146. var y:longint;
  147. begin
  148. while fa[x]<>f do
  149. begin
  150. y:=fa[x];
  151. if fa[y]=f then
  152. begin
  153. if son[y,]=x then rotate(x,)
  154. else rotate(x,);
  155. end
  156. else begin
  157. if son[fa[y],]=y then
  158. begin
  159. if son[y,]=x then rotate(y,) else rotate(x,);
  160. rotate(x,);
  161. end
  162. else begin
  163. if son[y,]=x then rotate(x,) else rotate(y,);
  164. rotate(x,);
  165. end;
  166. end;
  167. end;
  168. update(x);
  169. end;
  170.  
  171. function getrange(x,y:longint):longint;
  172. begin
  173. x:=find(x);
  174. y:=find(y+);
  175. splay(x,-);
  176. splay(y,x);
  177. exit(son[y,]);
  178. end;
  179.  
  180. function build(l,r:longint):longint;
  181. var m:longint;
  182. begin
  183. m:=(l+r) shr ;
  184. build:=m;
  185. if l<=m- then
  186. begin
  187. son[m,]:=build(l,m-);
  188. fa[son[m,]]:=m;
  189. end;
  190. if m+<=r then
  191. begin
  192. son[m,]:=build(m+,r);
  193. fa[son[m,]]:=m;
  194. end;
  195. update(m);
  196. end;
  197.  
  198. begin
  199. fillchar(fa,sizeof(fa),);
  200. fillchar(son,sizeof(son),);
  201. readln(n,m);
  202. for i:= to n do
  203. begin
  204. read(ch);
  205. if ch='(' then a[i]:= else a[i]:=-;
  206. end;
  207. readln;
  208. root:=build(,n+);
  209. for i:= to m do
  210. begin
  211. read(ch);
  212. s:='';
  213. while ch<>' ' do
  214. begin
  215. s:=s+ch;
  216. read(ch);
  217. end;
  218. read(x,y);
  219. z:=getrange(x,y);
  220. if s='Query' then
  221. writeln((abs(lmin[z])+) div +(rmax[z]+) div )
  222. else if s='Invert' then
  223. begin
  224. if laz[z]= then change(z)
  225. else replace(z,-laz[z]);
  226. end
  227. else if s='Swap' then
  228. reverse(z)
  229. else if s='Replace' then
  230. begin
  231. read(ch);
  232. while not((ch='(') or (ch=')')) do read(ch);
  233. if ch='(' then w:=
  234. else w:=-;
  235. replace(z,w);
  236. end;
  237. readln;
  238. end;
  239. end.

bzoj2209 2329的更多相关文章

  1. 【BZOJ】2329: [HNOI2011]括号修复(splay+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2329 和前一题一样,不就多了个replace操作吗.好,就打一下. 然后交上去wa了........ ...

  2. BZOJ 2329: [HNOI2011]括号修复( splay )

    把括号序列后一定是))))((((这种形式的..所以维护一个最大前缀和l, 最大后缀和r就可以了..答案就是(l+1)/2+(r+1)/2...用splay维护,O(NlogN). 其实还是挺好写的, ...

  3. ●BZOJ 2329 [HNOI2011]括号修复.cpp

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2329 题解: Splay 类似 BZOJ 2329 [HNOI2011]括号修复 只是多了一 ...

  4. BZOJ2209 [Jsoi2011]括号序列 splay

    原文链接http://www.cnblogs.com/zhouzhendong/p/8093556.html 题目传送门 - BZOJ2209 题解 我太弱了,调出这题感觉都要吐了. 题解懒得写了. ...

  5. BZOJ2209: [Jsoi2011]括号序列

    传送门 splay练习. 考虑把括号序列转化成类似于区间最大/最小值的情况. 显然我们可以知道括号序列消完的情况肯定是$a$个)和$b$个(,那么把这些括号全部合法化的代价显然就是$\frac{a+1 ...

  6. [POJ 2329] Nearest number-2

    Link: POJ 2329 传送门 Solution: 比较明显的$dp$,但爆搜好像也能过 用多个方向$dp$来解决此题,最后汇总答案即可 一开始我写了4个,但后来发现只要相反的2个方向即可,同时 ...

  7. [LOJ#2329]「清华集训 2017」我的生命已如风中残烛

    [LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...

  8. [HNOI2011][bzoj 2329] 括号修复 [splay+前缀和]

    题面: http://www.lydsy.com/JudgeOnline/problem.php?id=2329 思路: 显然,操作4中输出补全的最小费用是关键 这决定了我们不可能在splay上只维护 ...

  9. [NewTrain 10][poj 2329]Nearest Number - 2

    题面: http://poj.org/problem?id=2329 题解: 这题有很多做法 1. 搜索 复杂度$O(n^4)$ 但是实际上远远达不到这个复杂度 所以可以通过 2. 对于每一个格子,我 ...

随机推荐

  1. php 5.3 配置mssql笔记

    参考URL  https://docs.moodle.org/29/en/Installing_MSSQL_for_PHP#Using_FreeTDS_on_Debian_Lenny 第一步,下载相应 ...

  2. Jquery VailDate初探

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. WPF动画之关键帧动画(2)

    XAML代码: <Window x:Class="关键帧动画.MainWindow" xmlns="http://schemas.microsoft.com/win ...

  4. storm学习之入门篇(二)

    Strom的简单实现 Spout的实现 对文件的改变进行分开的监听,并监视目录下有无新日志文件添加. 在数据得到了字段的说明后,将其转换成tuple. 声明Spout和Bolt之间的分组,并决定tup ...

  5. asmdisk 丢失问题一次记录

    环境 vm12 workstation ,11.2R 在安装RAC 第二台机器不显示磁盘的是问题 , oracleasm listdisks 查询没有结果 , 于是执行 oracleasm scand ...

  6. 一次plsql 问题记录

    环境 : window 7 x64  oracle 10.2g  plsql 10.0.5 问题是 新装的 oracle10.2 plsql 一直连接不上 ,oracle_home 配置都对 .sql ...

  7. 常用命令ls cd cp mv touch mkdir pwd rm cut sort tr more less

    ls  -ldhtai 显示目录下面的文件 ls -l 显示详细信息 ls -d 显示当前目录 ls -t 以时间先后顺序显示 ls -a 列出所有文件包括隐藏文件 ls -i 显示文件的inode号 ...

  8. div 被Object盖住的。解决办法

    今天遇到一个比较头疼的问题,就是在一个标签上右键,弹出的菜单div被标签内的Office控件Object挡住了下半部分,始终无法显示.查了好多解决方案,最终都不能解决问题,几乎都要放弃了.中午吃饭的时 ...

  9. sass进阶篇总结一

    一.@if 指令: @if 指令是一个 SassScript,它可以根据条件来处理样式块,如果条件为 true 返回一个样式块,反之 false 返回另一个样式块.在 Sass 中除了 @if 之,还 ...

  10. git之环境配置(window+git+github)

    本地安装git 下载最新版的git:https://msysgit.googlecode.com/files/Git-1.9.0-preview20140217.exe 安装步骤:http://jin ...