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. Seay源代码审计系统的配置和安装

    2014年7月31日 Seay源代码审计系统2.1 时隔刚好一年之久,源代码审计系统再次更新,这次主要优化审计体验,优化了漏洞规则,算是小幅更新,原来使用者打开程序会提示自动更新. 1.优化原有规则, ...

  2. BUGKU--刷题

    刷题 一.BUGKU WEB 1. 变量1 知识点php两个$$是 可变变量,就是一个变量的变量名可以动态的设置和使用 $GLOBALS一个包含了全部变量的全局组合数组.变量的名字就是数组的键 < ...

  3. 安装loadrunner11出现Microsoft Visual c++2005 sp1安装失败

    本文转至别处,网上大神多

  4. Python中 list, numpy.array, torch.Tensor 格式相互转化

    1.1 list 转 numpy ndarray = np.array(list) 1.2 numpy 转 list list = ndarray.tolist() 2.1 list 转 torch. ...

  5. VMware在Centos7上配置静态IP的方法

    使用NAT模式 在这里记下192.168.161.2 进入系统,为系统自动分配一个ip 记录下 192.168.161.129 进入网络管理器配置文件目录 cd /etc/sysconfig/netw ...

  6. npm安装时一些错误

    1. npm install 提示no such file or directory 缺少package.json 首先初始化, npm init -f 然后安装依赖 npm install form ...

  7. 11慕课网《进击Node.js基础(一)》Buffer和Stream

    Buffer 用来保存原始数据 (logo.png) 以下代码读取logo.png为buffer类型 然后将buffer转化为string,新建png 可以将字符串配置: data:image/png ...

  8. Alpha 答辩总结

    前言 作业发布 组长 成员 贡献比例 ★ 530 雨勤 23% 311 旭 23% 403 俊 18% 223 元 23% 437 海辉 13% 10天 Alpha 冲刺站立会议博客链接汇总 Alph ...

  9. python + opencv 环境配置

    1.python 2.7.10 2.numpy 1.8.1 3.opencv2.4.8 4.OpenCV目录 ...\opencv\build\python\2.7" 下 "cv2 ...

  10. k8s kubectl edit 方式修改 nodeport 的端口

    0. 买了一本 每天五分钟玩转 k8s 还有 刚才转帖的blog 里面有一个 kubectl edit 的语法能够在线更改端口号 ,之前一直没弄明白. 刚才做了下实验.发现很好用 这里记录一下. 1. ...