解题思路:

Replace、Swap、Invert都可以使用Splay完美解决(只需要解决一下标记冲突就好了)。

最后只需要统计左右括号冲突就好了。

相当于动态统计最大前缀合和最小后缀和。

因为支持翻转反转操作,翻转标记或取反就好了。

代码:

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define lll tr[spc].ch[0]
#define rrr tr[spc].ch[1]
#define ls ch[0]
#define rs ch[1]
typedef long long lnt;
const int N=;
struct trnt{
int ch[];
int fa;
int wgt;
int val;
int sum;
int mxp;
int mnp;
int mxs;
int mns;
int lzt;
bool rev;
bool ant;
}tr[N];
int n,m;
int siz;
int root;
int num[N];
char cmd[N];
bool whc(int spc)
{
return tr[tr[spc].fa].rs==spc;
}
void pushup(int spc)
{
tr[spc].wgt=;
if(lll)
tr[spc].wgt+=tr[lll].wgt;
if(rrr)
tr[spc].wgt+=tr[rrr].wgt;
tr[spc].sum=tr[spc].val;
if(lll)
tr[spc].sum+=tr[lll].sum;
if(rrr)
tr[spc].sum+=tr[rrr].sum;
tr[spc].mxp=tr[spc].mxs=std::max(tr[spc].sum,);
tr[spc].mnp=tr[spc].mns=std::min(,tr[spc].sum);
if(lll)
{
tr[spc].mxp=std::max(tr[spc].mxp,std::max(tr[lll].mxp,tr[lll].sum+tr[spc].val));
tr[spc].mnp=std::min(tr[spc].mnp,std::min(tr[lll].mnp,tr[lll].sum+tr[spc].val));
tr[spc].mxs=std::max(tr[spc].mxs,std::max(tr[rrr].sum+tr[spc].val,tr[spc].val+tr[lll].mxs+tr[rrr].sum));
tr[spc].mns=std::min(tr[spc].mns,std::min(tr[rrr].sum+tr[spc].val,tr[spc].val+tr[lll].mns+tr[rrr].sum));
}
if(rrr)
{
tr[spc].mxs=std::max(tr[spc].mxs,std::max(tr[rrr].mxs,tr[rrr].sum+tr[spc].val));
tr[spc].mns=std::min(tr[spc].mns,std::min(tr[rrr].mns,tr[rrr].sum+tr[spc].val));
tr[spc].mxp=std::max(tr[spc].mxp,std::max(tr[lll].sum+tr[spc].val,tr[spc].val+tr[lll].sum+tr[rrr].mxp));
tr[spc].mnp=std::min(tr[spc].mnp,std::min(tr[lll].sum+tr[spc].val,tr[spc].val+tr[lll].sum+tr[rrr].mnp));
}
return ;
}
void trr(int spc)
{
if(!spc)
return ;
std::swap(lll,rrr);
std::swap(tr[spc].mxp,tr[spc].mxs);
std::swap(tr[spc].mnp,tr[spc].mns);
tr[spc].rev^=;
return ;
}
void anti(int spc)
{
if(!spc)
return ;
tr[spc].val*=-;
tr[spc].sum*=-;
tr[spc].mxp*=-;
tr[spc].mnp*=-;
tr[spc].mxs*=-;
tr[spc].mns*=-;
std::swap(tr[spc].mxp,tr[spc].mnp);
std::swap(tr[spc].mxs,tr[spc].mns);
tr[spc].ant^=;
return ;
}
void chg(int spc,int v)
{
if(!spc)
return ;
tr[spc].ant=false;
tr[spc].val=v;
tr[spc].lzt=v;
tr[spc].sum=v*tr[spc].wgt;
if(v==)
{
tr[spc].mnp=;
tr[spc].mns=;
tr[spc].mxp=v*tr[spc].wgt;
tr[spc].mxs=v*tr[spc].wgt;
}else{
tr[spc].mxp=;
tr[spc].mxs=;
tr[spc].mnp=v*tr[spc].wgt;
tr[spc].mns=v*tr[spc].wgt;
}
return ;
}
void pushdown(int spc)
{
if(tr[spc].rev)
{
trr(lll);
trr(rrr);
tr[spc].rev=false;
}
if(tr[spc].lzt)
{
chg(lll,tr[spc].lzt);
chg(rrr,tr[spc].lzt);
tr[spc].lzt=;
}
if(tr[spc].ant)
{
anti(lll);
anti(rrr);
tr[spc].ant=false;
}
return ;
}
void recal(int spc)
{
if(tr[spc].fa)
recal(tr[spc].fa);
pushdown(spc);
return ;
}
void rotate(int spc)
{
int f=tr[spc].fa;
bool k=whc(spc);
tr[f].ch[k]=tr[spc].ch[!k];
tr[spc].ch[!k]=f;
tr[tr[f].fa].ch[whc(f)]=spc;
tr[spc].fa=tr[f].fa;
tr[f].fa=spc;
tr[tr[f].ch[k]].fa=f;
pushup(f);
pushup(spc);
return ;
}
void splay(int spc,int f)
{
recal(spc);
while(tr[spc].fa!=f)
{
int ft=tr[spc].fa;
if(tr[ft].fa==f)
{
rotate(spc);
break;
}
if(whc(spc)^whc(ft))
rotate(spc);
else
rotate(ft);
rotate(spc);
}
if(!f)
root=spc;
return ;
}
void Build(int l,int r,int &spc,int f)
{
if(l>r)
return ;
int mid=(l+r)>>;
spc=++siz;
tr[spc].val=num[mid];
tr[spc].fa=f;
Build(l,mid-,lll,spc);
Build(mid+,r,rrr,spc);
pushup(spc);
return ;
}
int plc(int spc,int k)
{
pushdown(spc);
if(tr[lll].wgt>=k)
return plc(lll,k);
if(tr[lll].wgt+==k)
return spc;
return plc(rrr,k-tr[lll].wgt-);
}
void rush(int l,int r)
{
l=plc(root,l);
r=plc(root,r+);
splay(l,);
splay(r,root);
return ;
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%s",cmd+);
for(int i=;i<=n;i++)
num[i]=((cmd[i]==')')<<)-;
Build(,n+,root,);
while(m--)
{
int l,r;
scanf("%s",cmd+);
scanf("%d%d",&l,&r);
rush(l,r);
if(cmd[]=='R')
{
scanf("%s",cmd+);
chg(tr[tr[root].rs].ls,((cmd[]==')')<<)-);
}else if(cmd[]=='S')
trr(tr[tr[root].rs].ls);
else if(cmd[]=='I')
anti(tr[tr[root].rs].ls);
else{
int spc=tr[tr[root].rs].ls;
printf("%d\n",(tr[spc].mxp+)/+(-tr[spc].mns+)/);
}
pushup(tr[root].rs);
pushup(root);
}
return ;
}

BZOJ2329: [HNOI2011]括号修复(Splay)的更多相关文章

  1. BZOJ2329 HNOI2011 括号修复 splay+贪心

    找平衡树练习题的时候发现了这道神题,可以说这道题是近几年单考splay的巅峰之作了. 题目大意:给出括号序列,实现区间翻转,区间反转和区间更改.查询区间最少要用几次才能改成合法序列. 分析: 首先我们 ...

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

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

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

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

  4. 【bzoj2329】[HNOI2011]括号修复 Splay

    题目描述 题解 Splay 由于有区间反转操作,因此考虑Splay. 考虑答案:缩完括号序列后剩下的一定是 $a$ 个')'+ $b$ 个'(',容易发现答案等于 $\lceil\frac a2\rc ...

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

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

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

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

  7. BZOJ2329 [HNOI2011]括号修复

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

  8. 2019.03.25 bzoj2329: [HNOI2011]括号修复(fhq_treap)

    传送门 题意简述: 给一个括号序列,要求支持: 区间覆盖 区间取负 区间翻转 查询把一个区间改成合法括号序列最少改几位 思路: 先考虑静态的时候如何维护答案. 显然把所有合法的都删掉之后序列长这样: ...

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

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

随机推荐

  1. thinkphp里面的or查询

    thinkphp里面的or查询 whereOr 方法 使用whereOr 方法进行OR 查询: Db::table('think_user') ->where('name','like','%t ...

  2. Gym - 100625D Destination Unknown 最短路

    http://codeforces.com/gym/100625/attachments/download/3213/2013-benelux-algorithm-programming-contes ...

  3. Beautiful Soup的使用

    Beautiful Soup简单实用,功能也算比较全,之前下载都是自己使用xpath去获取信息,以后简单的解析可以用这个,方便省事. Beautiful Soup 是用 Python 写的一个 HTM ...

  4. Jsp学习总结(1)——JSP九大内置对象和四种属性范围解读

    一.四种属性范围 1.1.在JSP中提供了四种属性保存范围 page:在一个页面内保存属性,跳转之后无效 request:在一次服务请求范围内,服务器跳转后依然有效 session:-在一次会话范围内 ...

  5. 洛谷 P1914 小书童——密码

    P1914 小书童——密码 题目背景 某蒟蒻迷上了“小书童”,有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你. 题目描述 蒟蒻虽然忘记密码,但他还记得密码是由一串字母组成.且 ...

  6. windows下搭建hadoop-2.6.0本地idea开发环境

    概述 本文记录windows下hadoop本地开发环境的搭建: OS:windows hadoop执行模式:独立模式 安装包结构: Hadoop-2.6.0-Windows.zip - cygwinI ...

  7. 用c#编写爬虫在marinetraffic下载船仅仅图片

    近期在做船仅仅识别方面的事情,须要大量的正样本来训练adaboost分类器. 于是到marinetraffic这个站点上下载船仅仅图片.写个爬虫来自己主动下载显然非常方便. 站点特点 在介绍爬虫之前首 ...

  8. 用Vue.js来实现城市三级联动

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

  9. Kinect 开发 —— 骨骼追踪

    骨骼追踪技术通过处理景深数据来建立人体各个关节的坐标,骨骼追踪能够确定人体的各个部分,如那部分是手,头部,以及身体.骨骼追踪产生X,Y,Z数据来确定这些骨骼点.骨骼追踪系统采用的景深图像处理技术使用更 ...

  10. 【记录】无法读取配置节“AppSettings”,因为它缺少节声明

    Web.config对大小写敏感, 把AppSettings改为appSettings即可.