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 ...
随机推荐
- centos 7 tomcat 开机自启
第一章 1.将tomcat加入开启自己,以减少手动启动的麻烦 环境配置需要提前配置好.(我这里已经是不做操作了) 192.168.1.195 jdk1.8 + tomcat 8 第二章 2.编写to ...
- 外网主机访问虚拟机下的web服务器(NAT端口转发)-----端口映射
主机:系统win7,ip地址172.18.186.210 虚拟机:VMware Workstation 7,虚拟机下安装了Centos操作系统,ip地址是192.168.202.128,部署了LAMP ...
- 一个Boss直聘机器人, 自动回复发简历
goBoss 基佬github地址 这是基于go语言编写的一款boss直聘机器人软件(牛人版).附上Python版本, 无需配置Go环境, 我会提供windows和macos的可执行程序.不喜勿喷O( ...
- Laravel 5.6 视图用Blade语法传递变量和流程控制if 语句和循环语句
Laravel5.6 视图用Blade语法传递变量和流程控制if 语句和循环语句 Laravel 的 View 部分是内置了两套输出系统:直接输出和使用 Blade 引擎“编译”后输出,默认情况下它们 ...
- Flask入门的第一个项目
前言: Flask简介:Flask是一个使用 Python 编写的轻量级 Web 应用框架,基于 WerkzeugWSGI工具箱和 Jinja2模板引擎. 想要学习flask,又非常迷茫,不知如何下手 ...
- Hybrid APP基础篇(二)->Native、Hybrid、React Native、Web App方案的分析比较
说明 Native.Hybrid.React.Web App方案的分析比较 目录 前言 参考来源 前置技术要求 楔子 几种APP开发模式 概述 Native App Web App Hybrid Ap ...
- mybatis mapper使用记录
insert://插入一条数据//支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)//优先使用传入的参数值,参数值空时,才会使用序列.UUID,自动增长int i ...
- vs2013的安装与使用 测试
vs2013软件我去年已经用过,可是当时只是鉴于对于c语言的编程,并没有觉得好用,况且好多的功能自并没有去深入研究,所以当时对于这个软件还是排斥的.安装的时候是别人帮我装的,所以并没有在安装的过程有问 ...
- 4 vuex的安装
安装可以看,引入又问题https://blog.csdn.net/u014196765/article/details/78022065?locationNum=9&fps=1(引入) htt ...
- 微信 小程序组件 加入购物车全套 one wxml
<!--pages/shop/shop.wxml--> <view wx:if="{{hasList}}"> <view class="co ...