括号序列的经典做法
把(看成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的更多相关文章

  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. JavaScript高级程序设计(四): 关键字With的使用

    一.关键字with 1.含义    with 语句可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性.要给对象创建新的属性,必须明确地引用该对象.   简单的说,with为一个或一 ...

  2. requirejs下载与配置

    写在开始: requirejs有中文版api文档,可以访问http://www.requirejs.cn/home.html 下载requirejs 访问http://www.requirejs.cn ...

  3. spring mvc 笔记

    springmvc 课堂笔记 1.Springmvc是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想, ...

  4. checkbox 选择一个checkbox,其他checkbox也会选择

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

  5. HDU 3008 Warcraft(DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3008 题目大意:人有100血和100魔法,每秒增加 t 魔法(不能超过100).n个技能,每个技能消耗 ...

  6. OpenCV(5)-图像掩码操作(卷积)-锐化

    锐化概念 图像平滑过程是去除噪声的过程.图像的主要能量在低频部分,而噪声主要集中在高频部分.图像的边缘信息主要也在高频部分,在平滑处理后,将会丢不部分边缘信息.因此需要使用锐化技术来增强边缘. 平滑处 ...

  7. 文件打开方式O_DSYNC、O_RSYNC、O_SYNC

    O_DSYNC: 每次write都等待物理I/O完成,但是如果写操作不影响读取刚写入的数据,则不等待文件属性更新 O_RSYNC: 每个以文件描述符作为参数的read操作等待,直到所有对文件同一部分的 ...

  8. 理解Java中的字符串类型

    1.Java内置对字符串的支持: 所谓的内置支持,即不用像C语言通过char指针实现字符串类型,并且Java的字符串编码是符合Unicode编码标准,这也意味着不用像C++那样通过使用string和w ...

  9. ASP.NET数据绑定控件

    数据绑定控件简介 数据绑定分为:数据源 和 数据绑定控件 两部分,数据绑定控件通过数据源来获得数据,通过数据源来隔离数据提供者和数据使用者,数据源有:SqlDataSource,AccessDataS ...

  10. Oracle的硬解析和软解析

    提到软解析(soft prase)和硬解析(hard prase),就不能不说一下Oracle对sql的处理过程.当你发出一条sql语句交付Oracle,在执行和获取结果前,Oracle对此sql将进 ...