http://www.lydsy.com/JudgeOnline/problem.php?id=2329

需要改变的括号序列一定长这样 :)))(((

最少改变次数= 多余的‘)’/2 【上取整】 + 多余的‘(’ /2 【上取整】

把 ‘)’ 看做1,‘(’ 看做-1

那么最少改变次数=最大前缀和/2 【上取整】+ 最小后缀和/2 【上取整】

覆盖标记的优先级高于翻转标记和取反标记

即下放覆盖标记时,同时清空翻转标记和取反标记

且先下放覆盖标记

翻转:

最大前缀和 和 最大后缀和 交换

最小前缀和 和 最小后缀和 交换

取反:

最大前缀和 和 最小前缀和 交换,同时取反

最大后缀和 和 最小后缀和 交换,同时取反

最大XX和的下界为0,最小XX和的上界为0

因为最大XX和实际是多余的‘)’数量

最小XX和的相反数实际是多余的‘(’数量

数量不能为负数

注意点:

1、增加了首尾两个虚拟节点后,数组要多开2

2、平衡树每个节点由三部分组成,左子树、自己、右子树,打取反标记的时候不要忘记给自己取反

#include<cstdio>
#include<cstdlib>
#include<iostream> using namespace std; #define N 100003 char ss[N];
int a[N]; int root,tot; int st[N]; bool rev[N],inv[N];
int tag[N];
int pre[N],suf[N];
int sum[N];
int pri[N],val[N]; int siz[N],ch[N][]; int tmp; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} inline int &max(int &a,int &b) { return a>b ? a : b; }
inline int &min(int &a,int &b) { return a<b ? a : b; } void update(int x)
{
int l=ch[x][],r=ch[x][];
siz[x]=siz[l]+siz[r]+;
sum[x]=sum[l]+sum[r]+val[x];
pre[x]=max(pre[l],sum[l]+pre[r]+val[x]);
pre[x]=max(pre[x],sum[l]+val[x]);
suf[x]=max(suf[r],sum[r]+suf[l]+val[x]);
suf[x]=max(suf[x],sum[r]+val[x]);
} int newnode(int v)
{
val[++tot]=sum[tot]=v;
pre[tot]=suf[tot]=max(,val[tot]);
sum[tot]=val[tot];
siz[tot]=;
pri[tot]=rand();
return tot;
} int build(int l,int r)
{
int top=; int last,now;
for(int i=l;i<=r;++i)
{
now=newnode(a[i]);
last=;
while(top && pri[now]<pri[st[top]])
{
update(st[top]);
last=st[top--];
}
if(top) ch[st[top]][]=now;
ch[now][]=last;
st[++top]=now;
}
while(top) update(st[top--]);
return st[];
} void down(int x)
{
int l=ch[x][],r=ch[x][];
if(tag[x])
{
if(l)
{
val[l]=tag[x];
sum[l]=tag[x]*siz[l];
pre[l]=suf[l]=max(,sum[l]);
rev[l]=inv[l]=false;
tag[l]=tag[x];
}
if(r)
{
val[r]=tag[x];
sum[r]=tag[x]*siz[r];
pre[r]=suf[r]=max(,sum[r]);
rev[r]=inv[r]=false;
tag[r]=tag[x];
}
tag[x]=;
}
if(rev[x])
{
if(l)
{
swap(pre[l],suf[l]);
swap(ch[l][],ch[l][]);
rev[l]^=;
}
if(r)
{
swap(pre[r],suf[r]);
swap(ch[r][],ch[r][]);
rev[r]^=;
}
rev[x]^=;
}
if(inv[x])
{
if(l)
{
tmp=pre[l];
pre[l]=max(,-(sum[l]-suf[l]));
suf[l]=max(,-(sum[l]-tmp));
sum[l]=pre[l]+min(,-sum[l]-pre[l]);
val[l]=-val[l];
inv[l]^=;
}
if(r)
{
tmp=pre[r];
pre[r]=max(,-(sum[r]-suf[r]));
suf[r]=max(,-(sum[r]-tmp));
sum[r]=pre[r]+min(,-sum[r]-pre[r]);
val[r]=-val[r];
inv[r]^=;
}
inv[x]^=;
}
} void split(int now,int k,int &x,int &y)
{
if(!now) x=y=;
else
{
down(now);
if(k<=siz[ch[now][]])
{
y=now;
split(ch[now][],k,x,ch[now][]);
}
else
{
x=now;
split(ch[now][],k-siz[ch[now][]]-,ch[now][],y);
}
update(now);
}
} int merge(int x,int y)
{
if(x) down(x);
if(y) down(y);
if(!x || !y) return x+y;
if(pri[x]<pri[y])
{
ch[x][]=merge(ch[x][],y);
update(x);
return x;
}
else
{
ch[y][]=merge(x,ch[y][]);
update(y);
return y;
}
} int main()
{
int n,m;
read(n); read(m);
scanf("%s",ss+);
for(int i=;i<=n+;++i)
if(ss[i]==')') a[i]=;
else a[i]=-;
root=build(,n+);
int l,r; char s[],cc[];
int a,b,c,d,e;
while(m--)
{
scanf("%s",s);
read(l); read(r);
l++; r++;
split(root,r,a,b);
split(a,l-,c,d);
if(s[]=='R')
{
scanf("%s",cc);
e= cc[]==')' ? : -;
tag[d]=e;
val[d]=e;
sum[d]=e*siz[d];
pre[d]=suf[d]=max(,sum[d]);
rev[d]=inv[d]=false;
}
else if(s[]=='S')
{
rev[d]=true;
swap(ch[d][],ch[d][]);
swap(pre[d],suf[d]);
}
else if(s[]=='I')
{
inv[d]=true;
tmp=pre[d];
pre[d]=max(,-(sum[d]-suf[d]));
suf[d]=max(,-(sum[d]-tmp));
sum[d]=pre[d]+min(,-sum[d]-pre[d]);
val[d]=-val[d];
}
else printf("%d\n",(pre[d]+)/+(-sum[d]+pre[d]+)/);
root=merge(merge(c,d),b);
}
}

2329: [HNOI2011]括号修复

Time Limit: 40 Sec  Memory Limit: 128 MB
Submit: 1229  Solved: 580
[Submit][Status][Discuss]

Description

bzoj千题计划222:bzoj2329: [HNOI2011]括号修复(fhq treap)的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划191:bzoj2337: [HNOI2011]XOR和路径

    http://www.lydsy.com/JudgeOnline/problem.php?id=2337 概率不能异或 但根据期望的线性,可以计算出每一位为1的概率,再累积他们的期望 枚举每一位i,现 ...

  3. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  4. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  5. bzoj千题计划252:bzoj1095: [ZJOI2007]Hide 捉迷藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=1095 点分树+堆 请去看 http://www.cnblogs.com/TheRoadToTheGo ...

  6. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  7. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  8. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  9. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

随机推荐

  1. Centos 7 安装mysql5.7.24二进制 版本

    Mysql 二进制安装方法 下载mysql https://dev.mysql.com/downloads/mysql/ 1.解压包 tar xf mysql-5.7.24-linux-glibc2. ...

  2. saltstack-----master迁移篇

    打包/etc/salt/下的pki文件夹.发送到新的master,然后更改minion的hosts,重启minion,最后重启新master..搞定(salt "*" servic ...

  3. commitizen和cz-customizable配置git commit message

    起因 团队对提交的commit message格式有约定俗称的要求,但是没有一个统一的规范,导致大家提交的commit message或多或少不太一样.因此,需要一个工具来帮助大家统一commit m ...

  4. CEPH FILESYSTEM

    参考文档: CEPH FILESYSTEM:http://docs.ceph.com/docs/master/cephfs/ CephFS best practices:http://docs.cep ...

  5. ubuntu 下配置 开发环境

    1. apache: sudo apt-get install apache2 安装好输入网址测试所否成功: http://localhost 2. mongo 已经安装好了 版本:2.4.8 ref ...

  6. Photo Cleaner -- proposed by Wei Zhang

    Need想必大家都有用手机或相机记录生活的习惯吧!在旅途中,驴友们见到美丽的风景,往往激动地咔嚓一下拍张照记录下来.完事后发现角度不太好,于是又咔嚓一下……不知不觉中一下照了好多,然而真正需要的只是那 ...

  7. springboot项目的创建

    创建springboot项目 包名和项目名 选择需要使用的框架,web 然后再点击下一步,完成即可创建springboot项目

  8. 从零开始学Kotlin-操作符(3)

    从零开始学Kotlin基础篇系列文章 冒号操作符 ":" 和 "::" :操作符用来定义变量.类的继承等 var name: String//定义变量 clas ...

  9. Docker(二十二)-Docker Swarm常用命令

    #查看集群节点 docker node ls #创建nginx服务 #docker pull hub.test.com:5000/almi/nginx:0.1 #下载私有仓库镜像 docker ser ...

  10. CentOS7 安装redis 并且设置成服务自动启动

    通过 博客园 https://www.cnblogs.com/zuidongfeng/p/8032505.html 学习以及记录 1. 下载redis 现在最新的stable版本是 4.0.10 wg ...