恶心的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的更多相关文章

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

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

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

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

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

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

  4. BZOJ 2329: [HNOI2011]括号修复 [splay 括号]

    题目描述 一个合法的括号序列是这样定义的: 空串是合法的. 如果字符串 S 是合法的,则(S)也是合法的. 如果字符串 A 和 B 是合法的,则 AB 也是合法的. 现在给你一个长度为 N 的由‘(' ...

  5. 2329: [HNOI2011]括号修复

    传送魔法 一开始以为可以直接线段树的,好像还是不行……还是得用Spaly,然后就没啥了. #include<cstdio> #include<algorithm> #defin ...

  6. bzoj千题计划222:bzoj2329: [HNOI2011]括号修复(fhq treap)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2329 需要改变的括号序列一定长这样 :)))((( 最少改变次数= 多余的‘)’/2 [上取整] + ...

  7. 【BZOJ2329/2209】[HNOI2011]括号修复/[Jsoi2011]括号序列 Splay

    [BZOJ2329/2209][HNOI2011]括号修复/[Jsoi2011]括号序列 题解:我们的Splay每个节点维护如下东西:左边有多少多余的右括号,右边有多少多余的左括号,同时为了反转操作, ...

  8. BZOJ 2329/2209 [HNOI2011]括号修复 (splay)

    题目大意: 让你维护一个括号序列,支持 1.区间修改为同一种括号 2.区间内所有括号都反转 3.翻转整个区间,括号的方向不变 4.查询把某段区间变为合法的括号序列,至少需要修改多少次括号 给跪了,足足 ...

  9. BZOJ2329 [HNOI2011]括号修复

    把左括号看做$1$,右括号看做$-1$,于是查询操作等于查询一个区间左边右边最大(最小)子段和 支持区间翻转,反转,覆盖操作...注意如果有覆盖操作,之前的操作全部作废了...于是在下传标记的时候要最 ...

随机推荐

  1. [Yii2]Unable to verify your data submission(你提交的资料无法被验证)

    Yii2中,使用form提交数据,会提示: [yii\web\HttpException:400] exception 'yii\web\BadRequestHttpException' with m ...

  2. 【转】创业C2C(Copy To China):停车位共享APP,用户、市政能够买账?

    如果周六中午想开车到旧金山的Mission吃顿早午餐,笔者劝您还是省省吧.因为不光是到了吃饭的地儿排队得耗上一个小时,就是满大街的兜圈子找停车位都能折腾死人.那个时候您或许就明白了,其实最苦的并不是买 ...

  3. C#基础性问题

    解决方案.项目.类之间的关系: 一个解决方案可以包含多个项目.一个项目可以包含多个类 解决方案:公司 项目:部门 类:员工 .sln:解决方案文件,里面包含着整个解决方案的信息,可以双击运行. .cs ...

  4. Swift 性能探索和优化分析

    本文首发在 CSDN<程序员>杂志,订阅地址 http://dingyue.programmer.com.cn/. Apple 在推出 Swift 时就将其冠以先进,安全和高效的新一代编程 ...

  5. 【Android】ADB常用指令与logcat日志(转)

    ADB命令简介 ADB是一个功能强大的命令行工具.通过它可以直接和模拟器或真机进行交互.它是一个具有客户端和服务器端的程序. 它主要由三个部分组成: 客户端,它运行在你的开发机上,你可以通过执行adb ...

  6. Ajax概述

  7. Emmet的高级功能与使用技巧

    Emmet系列教程 前端开发利器Emmet的介绍 Emmet快速编写HTML代码 Emmet快速编写CSS样式 Emmet快速编写CSS样式 编写好HTML和CSS代码时,我们也需要修改或添加一些内容 ...

  8. (转)linux TOP命令各参数详解【转载】

    实时监控或查看系统资源使用情况的工具——TOP top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. 下面详细介绍它的使用方法: ( ...

  9. jquery实现2级联动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. linux之gdb使用

    gdb是linux下用来调试的一款软件,在这里,我只记录平常经常会用到的知识点,用到什么,就记录什么,在调试环境中去熟悉调试方法和调试工具,这才会加深理解. gdb能够做什么?它可以按照你的定义,随心 ...