bzoj千题计划222:bzoj2329: [HNOI2011]括号修复(fhq treap)
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)的更多相关文章
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划191:bzoj2337: [HNOI2011]XOR和路径
http://www.lydsy.com/JudgeOnline/problem.php?id=2337 概率不能异或 但根据期望的线性,可以计算出每一位为1的概率,再累积他们的期望 枚举每一位i,现 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划252:bzoj1095: [ZJOI2007]Hide 捉迷藏
http://www.lydsy.com/JudgeOnline/problem.php?id=1095 点分树+堆 请去看 http://www.cnblogs.com/TheRoadToTheGo ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...
- bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹
http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...
随机推荐
- docker之搭建私有仓库
一.私有仓库 1.防止网络原因:下载慢,访问不到的情况,需要在内网搭建一个私有仓库. 二.仓库镜像下载 [root@node03 ~]# docker pull registry 三.创建私有仓库容器 ...
- Katalon Studio学习笔记(二)——请求响应中文乱码解决方法
Katalon Studio接口测试发现返回的中文消息是乱码,这是因为KS的编码格式是UTF-8,因此导致中文字体出现乱码.如下图所示: 在我们的系统中添加一个名字为JAVA_TOOL_OPTIONS ...
- 【大数据实战】将普通文本文件导入ElasticSearch
以<刑法>文本.txt为例. 一.格式化数据 1,首先,ElasticSearch只能接收格式化的数据,所以,我们需要将文本文件转换为格式化的数据---json. 下图为未处理的文本文件. ...
- 2-Twelfth Scrum Meeting20151212
任务安排 成员 今日完成 明日任务 闫昊 获取视频播放的进度 获取视频播放进度 唐彬 解决handler可能引起的内存泄露问题 阅读IOS代码+阅读上届网络核心代码 史烨轩 下载service开发 ...
- 基于 Java Web 的毕业设计选题管理平台--测试报告与用户手册
一.测试报告 1.兼容性测试 功能 描述 效果 Chrome浏览器 FireFox浏览器 IE浏览器 war 端浏览器 管理员登录 管理员用户登录功能 弹出“登录成功”对话框,进入到毕业设计选题管理平 ...
- 使用VS2013进行C#程序的单元测试
没有按照预期的那样做出成功的单元测试,磕磕绊绊参照了下面两篇博客大致做出来了,所以很有必要记录一下过程. http://www.cnblogs.com/duasonir/p/5299732.html( ...
- Linux基础六(网络管理)
目录 一.网络配置 1. IP 地址配置 2. 网络配置文件 3. 虚拟机网络配置参数 二.网络命令 1. 网络环境查看命令 2. 网络测试命令 三.远程会话安全协议-SSH原理 1. SSH 原理 ...
- jQuery笔记(二)
$()下的常用方法 addClass():添加样式 removeClass():删除样式 $('div').addClass('box2 box4'); $('div').removeClass('b ...
- HDU 2015 偶数求和
http://acm.hdu.edu.cn/showproblem.php?pid=2015 Problem Description 有一个长度为n(n<=100)的数列,该数列定义为从2开始的 ...
- python学习大全:python基础进阶+人工智能+机器学习+神经网络
首先用数据说话,看看资料大小,达到675G承诺:真实资料.不加密.(鉴于太多朋友加我QQ,我无法及时回复,) 方便的朋友给我点赞.评论下,谢谢!(内容较大,多次保存) [hide]链接:[url]ht ...