解题思路:

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. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记35 UITextField文本框

    本话来介绍UIKit框架中的组件UITextField. UItextField(文本框)和Label看起来看像,可是文本框是能够编辑的.在UI中使用文本框要注意.由于在模拟器上面输入文字是能够使用电 ...

  2. xcode 4 svn配置(host is unreachable)

    xcode 4 svn配置 先保证你的xcode中已经安装了command line tools xcode -> preferences -> downloads -> comma ...

  3. BZOJ 1146 二分+链剖+线段树+treap

    思路: 恶心的数据结构题-- 首先 我们 链剖 把树 变成序列 再 套一个 区间 第K大就好了-- 复杂度(n*log^4n) //By SiriusRen #include <cstdio&g ...

  4. 2015合肥网络赛 HDU 5492 Find a path 动归

    HDU 5492 Find a path 题意:给你一个矩阵求一个路径使得 最小. 思路: 方法一:数据特别小,直接枚举权值和(n + m - 1) * aver,更新答案. 方法二:用f[i][j] ...

  5. 网络场景图WebScene介绍

    网络场景图的创建同样需要ID,然后再放入3维的地图底图中. 1.创建一个新的网络场景图 "esri/WebScene" var scene = new WebScene({ por ...

  6. BZOJ1367: [Baltic2004]sequence(左偏树)

    Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sample Output 13 解题思路: 有趣的数学题. 首先确定序 ...

  7. 9.9递归和动态规划(九)——N皇后

    /**  * 功能:打印八皇后在8*8棋盘上的各种摆法.当中每一个皇后都不同行.不同列,也不在对角线上.  * 这里的"对角线"指的是全部的对角线,不仅仅是平分整个棋盘的那两条对角 ...

  8. 6.前端开发必备!Emmet使用手册

    转自:https://www.w3cplus.com/tools/emmet-cheat-sheet.html 介绍 Emmet (前身为 Zen Coding) 是一个能大幅度提高前端开发效率的一个 ...

  9. zoj 1119 / poj 1523 SPF (典型例题 求割点 Tarjan 算法)

    poj : http://poj.org/problem?id=1523 如果无向图中一个点 u 为割点 则u 或者是具有两个及以上子女的深度优先生成树的根,或者虽然不是一个根,但是它有一个子女 w, ...

  10. ElasticSearch vs Lucene多维度分析对比

    ElasticSearch vs Lucene的关系,简单一句话就是,成品与半成品的关系. (1)Lucene专注于搜索底层的建设,而ElasticSearch专注于企业应用.   (2)Luncen ...