bzoj2209 2329
括号序列的经典做法
把(看成1,)看成-1
匹配的括号序列即任意前缀和都非负
我们先解决静态的问题,给定一段括号序列求最少修改次数
我们先找出最大后缀和a和最小前缀和b
之间一定可以不相交
显然a+|b|个括号是未匹配的
显然修改即为(|b|+1) div 2+(a+1) div 2;
由于序列的变化,我们用splay维护
由于涉及到括号反转我们还要维护左最大和右最小
然后就没了
这个是bzoj2329的代码
- var son:array[..,..] of longint;
- laz,lmax,rmax,lmin,rmin,size,sum,a,fa:array[..] of longint;
- cha,rev:array[..] of boolean;
- root,i,n,m,x,y,z,w:longint;
- ch:char;
- s:string;
- function min(a,b:longint):longint;
- begin
- if a>b then exit(b) else exit(a);
- end;
- function max(a,b:longint):longint;
- begin
- if a>b then exit(a) else exit(b);
- end;
- procedure swap(var a,b:longint);
- var c:longint;
- begin
- c:=a;
- a:=b;
- b:=c;
- end;
- procedure get(var a,b:longint);
- var c:longint;
- begin
- c:=a;
- a:=-b;
- b:=-c;
- end;
- procedure update(x:longint);
- var l,r:longint;
- begin
- l:=son[x,];
- r:=son[x,];
- size[x]:=size[l]+size[r]+;
- sum[x]:=sum[l]+sum[r]+a[x];
- lmax[x]:=max(lmax[l],sum[l]+a[x]+lmax[r]);
- rmax[x]:=max(rmax[r],sum[r]+a[x]+rmax[l]);
- lmin[x]:=min(lmin[l],sum[l]+a[x]+lmin[r]);
- rmin[x]:=min(rmin[r],sum[r]+a[x]+rmin[l]);
- end;
- procedure replace(x,w:longint);
- begin
- a[x]:=w;
- laz[x]:=w;
- cha[x]:=false;
- if w=- then
- begin
- sum[x]:=-size[x];
- lmax[x]:=;
- rmax[x]:=;
- lmin[x]:=sum[x];
- rmin[x]:=sum[x];
- end
- else begin
- sum[x]:=size[x];
- lmax[x]:=sum[x];
- rmax[x]:=sum[x];
- lmin[x]:=;
- rmin[x]:=;
- end;
- end;
- procedure reverse(x:longint);
- begin
- swap(son[x,],son[x,]);
- swap(lmax[x],rmax[x]);
- swap(lmin[x],rmin[x]);
- rev[x]:=not rev[x];
- end;
- procedure change(x:longint);
- begin
- a[x]:=-a[x];
- sum[x]:=-sum[x];
- get(lmax[x],lmin[x]);
- get(rmax[x],rmin[x]);
- cha[x]:=not cha[x];
- end;
- procedure push(x:longint);
- var l,r:longint;
- begin
- l:=son[x,];
- r:=son[x,];
- if laz[x]<> then
- begin
- if l<>- then replace(l,laz[x]);
- if r<>- then replace(r,laz[x]);
- laz[x]:=;
- end;
- if cha[x] then
- begin
- if l<>- then change(l);
- if r<>- then change(r);
- cha[x]:=false;
- end;
- if rev[x] then
- begin
- if l<>- then reverse(l);
- if r<>- then reverse(r);
- rev[x]:=false;
- end;
- end;
- function find(k:longint):longint;
- var p:longint;
- begin
- p:=root;
- while true do
- begin
- push(p);
- if size[son[p,]]+=k then exit(p);
- if size[son[p,]]+>k then p:=son[p,]
- else begin
- k:=k-size[son[p,]]-;
- p:=son[p,];
- end;
- end;
- end;
- procedure rotate(x,w:longint);
- var y:longint;
- begin
- y:=fa[x];
- push(x);
- if fa[y]=- then root:=x
- else begin
- if son[fa[y],]=y then son[fa[y],]:=x
- else son[fa[y],]:=x;
- end;
- fa[x]:=fa[y];
- son[y,-w]:=son[x,w];
- if son[x,w]<>- then fa[son[x,w]]:=y;
- son[x,w]:=y;
- fa[y]:=x;
- update(y);
- end;
- procedure splay(x,f:longint);
- var y:longint;
- begin
- while fa[x]<>f do
- begin
- y:=fa[x];
- if fa[y]=f then
- begin
- if son[y,]=x then rotate(x,)
- else rotate(x,);
- end
- else begin
- if son[fa[y],]=y then
- begin
- if son[y,]=x then rotate(y,) else rotate(x,);
- rotate(x,);
- end
- else begin
- if son[y,]=x then rotate(x,) else rotate(y,);
- rotate(x,);
- end;
- end;
- end;
- update(x);
- end;
- function getrange(x,y:longint):longint;
- begin
- x:=find(x);
- y:=find(y+);
- splay(x,-);
- splay(y,x);
- exit(son[y,]);
- end;
- function build(l,r:longint):longint;
- var m:longint;
- begin
- m:=(l+r) shr ;
- build:=m;
- if l<=m- then
- begin
- son[m,]:=build(l,m-);
- fa[son[m,]]:=m;
- end;
- if m+<=r then
- begin
- son[m,]:=build(m+,r);
- fa[son[m,]]:=m;
- end;
- update(m);
- end;
- begin
- fillchar(fa,sizeof(fa),);
- fillchar(son,sizeof(son),);
- readln(n,m);
- for i:= to n do
- begin
- read(ch);
- if ch='(' then a[i]:= else a[i]:=-;
- end;
- readln;
- root:=build(,n+);
- for i:= to m do
- begin
- read(ch);
- s:='';
- while ch<>' ' do
- begin
- s:=s+ch;
- read(ch);
- end;
- read(x,y);
- z:=getrange(x,y);
- if s='Query' then
- writeln((abs(lmin[z])+) div +(rmax[z]+) div )
- else if s='Invert' then
- begin
- if laz[z]= then change(z)
- else replace(z,-laz[z]);
- end
- else if s='Swap' then
- reverse(z)
- else if s='Replace' then
- begin
- read(ch);
- while not((ch='(') or (ch=')')) do read(ch);
- if ch='(' then w:=
- else w:=-;
- replace(z,w);
- end;
- readln;
- end;
- end.
bzoj2209 2329的更多相关文章
- 【BZOJ】2329: [HNOI2011]括号修复(splay+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=2329 和前一题一样,不就多了个replace操作吗.好,就打一下. 然后交上去wa了........ ...
- BZOJ 2329: [HNOI2011]括号修复( splay )
把括号序列后一定是))))((((这种形式的..所以维护一个最大前缀和l, 最大后缀和r就可以了..答案就是(l+1)/2+(r+1)/2...用splay维护,O(NlogN). 其实还是挺好写的, ...
- ●BZOJ 2329 [HNOI2011]括号修复.cpp
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2329 题解: Splay 类似 BZOJ 2329 [HNOI2011]括号修复 只是多了一 ...
- BZOJ2209 [Jsoi2011]括号序列 splay
原文链接http://www.cnblogs.com/zhouzhendong/p/8093556.html 题目传送门 - BZOJ2209 题解 我太弱了,调出这题感觉都要吐了. 题解懒得写了. ...
- BZOJ2209: [Jsoi2011]括号序列
传送门 splay练习. 考虑把括号序列转化成类似于区间最大/最小值的情况. 显然我们可以知道括号序列消完的情况肯定是$a$个)和$b$个(,那么把这些括号全部合法化的代价显然就是$\frac{a+1 ...
- [POJ 2329] Nearest number-2
Link: POJ 2329 传送门 Solution: 比较明显的$dp$,但爆搜好像也能过 用多个方向$dp$来解决此题,最后汇总答案即可 一开始我写了4个,但后来发现只要相反的2个方向即可,同时 ...
- [LOJ#2329]「清华集训 2017」我的生命已如风中残烛
[LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...
- [HNOI2011][bzoj 2329] 括号修复 [splay+前缀和]
题面: http://www.lydsy.com/JudgeOnline/problem.php?id=2329 思路: 显然,操作4中输出补全的最小费用是关键 这决定了我们不可能在splay上只维护 ...
- [NewTrain 10][poj 2329]Nearest Number - 2
题面: http://poj.org/problem?id=2329 题解: 这题有很多做法 1. 搜索 复杂度$O(n^4)$ 但是实际上远远达不到这个复杂度 所以可以通过 2. 对于每一个格子,我 ...
随机推荐
- php 5.3 配置mssql笔记
参考URL https://docs.moodle.org/29/en/Installing_MSSQL_for_PHP#Using_FreeTDS_on_Debian_Lenny 第一步,下载相应 ...
- Jquery VailDate初探
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- WPF动画之关键帧动画(2)
XAML代码: <Window x:Class="关键帧动画.MainWindow" xmlns="http://schemas.microsoft.com/win ...
- storm学习之入门篇(二)
Strom的简单实现 Spout的实现 对文件的改变进行分开的监听,并监视目录下有无新日志文件添加. 在数据得到了字段的说明后,将其转换成tuple. 声明Spout和Bolt之间的分组,并决定tup ...
- asmdisk 丢失问题一次记录
环境 vm12 workstation ,11.2R 在安装RAC 第二台机器不显示磁盘的是问题 , oracleasm listdisks 查询没有结果 , 于是执行 oracleasm scand ...
- 一次plsql 问题记录
环境 : window 7 x64 oracle 10.2g plsql 10.0.5 问题是 新装的 oracle10.2 plsql 一直连接不上 ,oracle_home 配置都对 .sql ...
- 常用命令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号 ...
- div 被Object盖住的。解决办法
今天遇到一个比较头疼的问题,就是在一个标签上右键,弹出的菜单div被标签内的Office控件Object挡住了下半部分,始终无法显示.查了好多解决方案,最终都不能解决问题,几乎都要放弃了.中午吃饭的时 ...
- sass进阶篇总结一
一.@if 指令: @if 指令是一个 SassScript,它可以根据条件来处理样式块,如果条件为 true 返回一个样式块,反之 false 返回另一个样式块.在 Sass 中除了 @if 之,还 ...
- git之环境配置(window+git+github)
本地安装git 下载最新版的git:https://msysgit.googlecode.com/files/Git-1.9.0-preview20140217.exe 安装步骤:http://jin ...