2329: [HNOI2011]括号修复 - BZOJ

恶心的splay,打标记的时候还有冲突,要特别小心
上次写完了,查了半天没查出错来,于是放弃
今天对着标程打代码,终于抄完了,我已经不想再写了
const
maxn=;
type
node=record
data,sum,lc,rc,re,size,lmin,lmax,rmin,rmax:longint;
sw,inv:boolean;
end; var
f:array[..maxn]of node;
ans,root,n,m,i,x,y:longint;
ch:char; procedure swap(var x,y:longint);
var
t:longint;
begin
t:=x;x:=y;y:=t;
end; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end; procedure updata(x:longint);
begin
with f[x] do
begin
size:=f[lc].size+f[rc].size+;
sum:=f[lc].sum+f[rc].sum+data;
lmax:=max(f[lc].lmax,f[lc].sum+data+f[rc].lmax);
lmin:=min(f[lc].lmin,f[lc].sum+data+f[rc].lmin);
rmax:=max(f[rc].rmax,f[rc].sum+data+f[lc].rmax);
rmin:=min(f[rc].rmin,f[rc].sum+data+f[lc].rmin);
end;
end; procedure release(x:longint);
begin
if x= then exit;
with f[x] do
begin
if re<> then
begin
data:=re;
sum:=size*re;
lmin:=min(,sum);
rmin:=lmin;
lmax:=max(,sum);
rmax:=lmax;
f[lc].re:=re;
f[rc].re:=re;
f[lc].inv:=false;
f[rc].inv:=false;
re:=;
end;
if sw then
begin
swap(lc,rc);
swap(lmax,rmax);
swap(lmin,rmin);
f[lc].sw:=not f[lc].sw;
f[rc].sw:=not f[rc].sw;
sw:=false;
end;
if inv then
begin
data:=-data;
sum:=-sum;
swap(lmin,lmax);
swap(rmin,rmax);
lmin:=-lmin;
lmax:=-lmax;
rmin:=-rmin;
rmax:=-rmax;
f[lc].inv:=not f[lc].inv;
f[rc].inv:=not f[rc].inv;
inv:=false;
end;
end;
end; procedure splay(x:longint;var root:longint);
var
tmp:longint;
begin
release(root);
release(f[root].lc);
release(f[root].rc);
if x=f[f[root].lc].size+ then exit;
if x<=f[f[root].lc].size then
begin
splay(x,f[root].lc);
tmp:=f[root].lc;
f[root].lc:=f[tmp].rc;
f[tmp].rc:=root;
updata(root);
root:=tmp;
end
else
begin
splay(x-f[f[root].lc].size-,f[root].rc);
tmp:=f[root].rc;
f[root].rc:=f[tmp].lc;
f[tmp].lc:=root;
updata(root);
root:=tmp;
end;
end; procedure splay(x:longint);
begin
splay(x,root);
updata(root);
end; procedure build(l,r:longint;var now:longint);
var
mid:longint;
begin
if l>r then exit;
mid:=(l+r)>>;
now:=mid;
build(l,mid-,f[mid].lc);
build(mid+,r,f[mid].rc);
updata(mid);
end; begin
readln(n,m);
for i:= to n+ do
begin
read(ch);
if ch='(' then f[i].data:=
else f[i].data:=-;
end;
build(,n+,root);
readln;
while m> do
begin
dec(m);
read(ch);
case ch of
'R':begin
readln(ch,ch,ch,ch,ch,ch,x,y,ch,ch);
splay(y+);
splay(x);
if ch='(' then f[f[f[root].rc].lc].re:=
else f[f[f[root].rc].lc].re:=-;
release(f[f[root].rc].lc);
updata(f[root].rc);
updata(root);
end;
'S':begin
readln(ch,ch,ch,x,y);
splay(y+);
splay(x);
f[f[f[root].rc].lc].sw:=true;
release(f[f[root].rc].lc);
updata(f[root].rc);
updata(root);
end;
'I':begin
readln(ch,ch,ch,ch,ch,x,y);
splay(y+);
splay(x);
f[f[f[root].rc].lc].inv:=true;
release(f[f[root].rc].lc);
updata(f[root].rc);
updata(root);
end;
'Q':begin
readln(ch,ch,ch,ch,x,y);
splay(y+);
splay(x);
writeln((-f[f[f[root].rc].lc].lmin)>>+(+f[f[f[root].rc].lc].rmax)>>);
end;
end;
end;
end.
2329: [HNOI2011]括号修复 - BZOJ的更多相关文章
- ●BZOJ 2329 [HNOI2011]括号修复.cpp
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2329 题解: Splay 类似 BZOJ 2329 [HNOI2011]括号修复 只是多了一 ...
- BZOJ 2329: [HNOI2011]括号修复( splay )
把括号序列后一定是))))((((这种形式的..所以维护一个最大前缀和l, 最大后缀和r就可以了..答案就是(l+1)/2+(r+1)/2...用splay维护,O(NlogN). 其实还是挺好写的, ...
- 【BZOJ】2329: [HNOI2011]括号修复(splay+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=2329 和前一题一样,不就多了个replace操作吗.好,就打一下. 然后交上去wa了........ ...
- BZOJ 2329: [HNOI2011]括号修复 [splay 括号]
题目描述 一个合法的括号序列是这样定义的: 空串是合法的. 如果字符串 S 是合法的,则(S)也是合法的. 如果字符串 A 和 B 是合法的,则 AB 也是合法的. 现在给你一个长度为 N 的由‘(' ...
- 2329: [HNOI2011]括号修复
传送魔法 一开始以为可以直接线段树的,好像还是不行……还是得用Spaly,然后就没啥了. #include<cstdio> #include<algorithm> #defin ...
- bzoj千题计划222:bzoj2329: [HNOI2011]括号修复(fhq treap)
http://www.lydsy.com/JudgeOnline/problem.php?id=2329 需要改变的括号序列一定长这样 :)))((( 最少改变次数= 多余的‘)’/2 [上取整] + ...
- 【BZOJ2329/2209】[HNOI2011]括号修复/[Jsoi2011]括号序列 Splay
[BZOJ2329/2209][HNOI2011]括号修复/[Jsoi2011]括号序列 题解:我们的Splay每个节点维护如下东西:左边有多少多余的右括号,右边有多少多余的左括号,同时为了反转操作, ...
- BZOJ 2329/2209 [HNOI2011]括号修复 (splay)
题目大意: 让你维护一个括号序列,支持 1.区间修改为同一种括号 2.区间内所有括号都反转 3.翻转整个区间,括号的方向不变 4.查询把某段区间变为合法的括号序列,至少需要修改多少次括号 给跪了,足足 ...
- BZOJ2329 [HNOI2011]括号修复
把左括号看做$1$,右括号看做$-1$,于是查询操作等于查询一个区间左边右边最大(最小)子段和 支持区间翻转,反转,覆盖操作...注意如果有覆盖操作,之前的操作全部作废了...于是在下传标记的时候要最 ...
随机推荐
- saltstack实战3--配置管理之grains
grains是什么 grains是minion服务启动后,采集的客户端的一些基本信息,硬件信息,软件信息,网络信息,软件版本等.你可以在minion上自定义一些grains信息. 它是静态的信息,mi ...
- (转)linuxmint,ubuntu 下修改guake宽度方法
之前在网上找到修改guake.py的方式,但是我一直没能找到guake.py的文件,弄的我纠结,后来找到这个文章,这个确实是有效果的 Ubuntu12.04上Guake在唤出的时候滚动条会消失,主要原 ...
- HttpClient(4.3.5) - HttpClient Proxy Configuration
Even though HttpClient is aware of complex routing scemes and proxy chaining, it supports only simpl ...
- Tomcat - DBCP 配置
1. Database configuration Create a new test user, a new database and a single test table. Your MySQL ...
- Intent的属性介绍
在Android系统的设计中有四大组件:Activity,Service,BroadcastReceiver,ContentProvider.Intent可以被应用于ContentProvider之外 ...
- Linux c字符串中不可打印字符转换成16进制
本文由 www.169it.com 搜集整理 如果一个C字符串中同时包含可打印和不可打印的字符,如果想将这个字符串写入文件,同时方便打开文件查看或者在控制台中打印出来不会出现乱码,那么可以将字符串中的 ...
- C#WebBrowser控件使用教程与技巧
获取非input控件的值 webBrowser1.Document.All["控件ID"].InnerText;或webBrowser1.Document.GetElementBy ...
- Swift静态属性
在介绍静态属性之前,我们先来看一个类的设计,有一个Account(银行账户)类,假设它有3个属性:amount(账户金额).interestRate(利率)和owner(账户名).在这3个属性中,am ...
- C# 线程--第四线程实例
概述 在前面几节中和大家分享了线程的一些基础使用方法,本章结合之前的分享来编写一些日常开发中应用实例,和编写多线程时一些注意点.如大家有好的实例也欢迎分享.. 应用实例 应用:定时任务程序 场景:系统 ...
- C#中String类的几个方法(IndexOf、LastIndexOf、Substring)
String.IndexOf String.IndexOf 方法 (Char, Int32, Int32)报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检查指定数量的字符位置. ...