题链:

Splay
类似 BZOJ 2329 [HNOI2011]括号修复
只是多了一个Replace(替换)操作,
然后就要主要lazy标记之间的影响了。
1).Replace可以直接覆盖另外两个标记,
2).当已经有Replace标记,再覆盖Invert标记时,直接把Replace标记取反即可;在覆盖Swap标记时,Replace标记不变。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 100500
using namespace std;
char s[10];
int N,M;
struct SPT{
int pmx[MAXN],pmn[MAXN],smx[MAXN],smn[MAXN],sum[MAXN],key[MAXN];
int ch[MAXN][2],siz[MAXN],fa[MAXN],cg[MAXN],lazy[MAXN],rt;
void Invert(int x){
sum[x]*=-1; key[x]*=-1;
pmx[x]*=-1; pmn[x]*=-1; swap(pmx[x],pmn[x]);
smx[x]*=-1; smn[x]*=-1; swap(smx[x],smn[x]);
}
void Swap(int x){
swap(pmx[x],smx[x]);
swap(pmn[x],smn[x]);
swap(ch[x][0],ch[x][1]);
}
void Replace(int x,int c){
key[x]=c; sum[x]=c*siz[x];
pmx[x]=max(sum[x],0); pmn[x]=min(sum[x],0);
smx[x]=max(sum[x],0); smn[x]=min(sum[x],0);
}
void Pushup(int x){
siz[x]=siz[ch[x][0]]+1+siz[ch[x][1]];
sum[x]=sum[ch[x][0]]+key[x]+sum[ch[x][1]];
pmx[x]=max(pmx[ch[x][0]],sum[ch[x][0]]+key[x]+pmx[ch[x][1]]);
pmn[x]=min(pmn[ch[x][0]],sum[ch[x][0]]+key[x]+pmn[ch[x][1]]);
smx[x]=max(smx[ch[x][1]],sum[ch[x][1]]+key[x]+smx[ch[x][0]]);
smn[x]=min(smn[ch[x][1]],sum[ch[x][1]]+key[x]+smn[ch[x][0]]);
}
void Pushdown(int x){
if(cg[x]!=0){
Replace(ch[x][0],cg[x]); cg[ch[x][0]]=cg[x]; lazy[ch[x][0]]=0;
Replace(ch[x][1],cg[x]); cg[ch[x][1]]=cg[x]; lazy[ch[x][1]]=0;
cg[x]=0;
}
if(lazy[x]&1){
Invert(ch[x][0]);
if(!cg[ch[x][0]]) lazy[ch[x][0]]^=1; else cg[ch[x][0]]*=-1;
Invert(ch[x][1]);
if(!cg[ch[x][1]]) lazy[ch[x][1]]^=1; else cg[ch[x][1]]*=-1;
lazy[x]^=1;
}
if(lazy[x]&2){
Swap(ch[x][0]);
if(!cg[ch[x][0]]) lazy[ch[x][0]]^=2;
Swap(ch[x][1]);
if(!cg[ch[x][1]]) lazy[ch[x][1]]^=2;
lazy[x]^=2;
}
}
void Rotate(int x,int &k){
static int y,z,l,r;
y=fa[x]; z=fa[y];
l=ch[y][0]!=x; r=l^1;
if(!z) k=x;
else ch[z][ch[z][0]!=y]=x;
fa[ch[x][r]]=y; fa[y]=x; fa[x]=z;
ch[y][l]=ch[x][r]; ch[x][r]=y;
Pushup(y);
}
void Splay(int x,int &k){
static int y,z;
while(x!=k){
y=fa[x]; z=fa[y];
if(y!=k) (ch[z][0]!=y)^(ch[y][0]!=x)?
Rotate(x,k):Rotate(y,k);
Rotate(x,k);
}
Pushup(x);
}
int find(int x,int num){
Pushdown(x);
if(num<=siz[ch[x][0]]) return find(ch[x][0],num);
else if(num==siz[ch[x][0]]+1) return x;
else return find(ch[x][1],num-siz[ch[x][0]]-1);
}
int Split(int l,int r){
static int dl,dr;
dl=find(rt,l); dr=find(rt,r+2);
Splay(dl,rt); Splay(dr,ch[dl][1]);
return ch[dr][0];
}
void Modify(int l,int r,int type){
static int p;
p=Split(l,r);
if(type==3){
Replace(p,(s[0]=='('?1:-1));
cg[p]=(s[0]=='('?1:-1); lazy[p]=0;
}
else{
if(type==1) Invert(p);
else Swap(p);
if(!cg[p]) lazy[p]^=type;
else if(type==1) cg[p]*=-1;
}
Pushup(fa[p]); Pushup(fa[fa[p]]);
}
void Build(int &x,int dad,int l,int r){
static char c;
if(l>r) return;
x=(l+r)>>1; fa[x]=dad;
Build(ch[x][0],x,l,x-1);
scanf(" %c",&c); key[x]=(c=='('?1:-1);
Build(ch[x][1],x,x+1,r);
Pushup(x);
}
void BorderBuild(){
rt=N+1;
key[N+1]=0; key[N+2]=0;
ch[N+1][1]=N+2; fa[N+2]=N+1;
Build(ch[N+2][0],N+2,1,N);
Pushup(N+2); Pushup(N+1);
}
int Query(int l,int r){
static int p,ANS,nl,nr;
p=Split(l,r);
nl=-pmn[p]; nr=smx[p];
ANS=(nl+1)/2+(nr+1)/2;
return ANS;
}
}DT;
int main(){
freopen("/home/noilinux/Documents/模块学习/2329.in","r",stdin);
freopen("/home/noilinux/Documents/模块学习/2329.out","w",stdout);
scanf("%d%d",&N,&M);
DT.BorderBuild();
for(int i=1,l,r;i<=M;i++){
scanf("%s",s); scanf("%d%d",&l,&r);
if(s[0]=='Q') printf("%d\n",DT.Query(l,r));
if(s[0]=='I') DT.Modify(l,r,1);
if(s[0]=='S') DT.Modify(l,r,2);
if(s[0]=='R') scanf("%s",s),DT.Modify(l,r,3);
}
return 0;
}

  

●BZOJ 2329 [HNOI2011]括号修复.cpp的更多相关文章

  1. BZOJ 2329: [HNOI2011]括号修复( splay )

    把括号序列后一定是))))((((这种形式的..所以维护一个最大前缀和l, 最大后缀和r就可以了..答案就是(l+1)/2+(r+1)/2...用splay维护,O(NlogN). 其实还是挺好写的, ...

  2. BZOJ 2329: [HNOI2011]括号修复 [splay 括号]

    题目描述 一个合法的括号序列是这样定义的: 空串是合法的. 如果字符串 S 是合法的,则(S)也是合法的. 如果字符串 A 和 B 是合法的,则 AB 也是合法的. 现在给你一个长度为 N 的由‘(' ...

  3. 【BZOJ】2329: [HNOI2011]括号修复(splay+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2329 和前一题一样,不就多了个replace操作吗.好,就打一下. 然后交上去wa了........ ...

  4. 2329: [HNOI2011]括号修复 - BZOJ

    恶心的splay,打标记的时候还有冲突,要特别小心 上次写完了,查了半天没查出错来,于是放弃 今天对着标程打代码,终于抄完了,我已经不想再写了 const maxn=; type node=recor ...

  5. 2329: [HNOI2011]括号修复

    传送魔法 一开始以为可以直接线段树的,好像还是不行……还是得用Spaly,然后就没啥了. #include<cstdio> #include<algorithm> #defin ...

  6. bzoj千题计划222:bzoj2329: [HNOI2011]括号修复(fhq treap)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2329 需要改变的括号序列一定长这样 :)))((( 最少改变次数= 多余的‘)’/2 [上取整] + ...

  7. 【BZOJ2329/2209】[HNOI2011]括号修复/[Jsoi2011]括号序列 Splay

    [BZOJ2329/2209][HNOI2011]括号修复/[Jsoi2011]括号序列 题解:我们的Splay每个节点维护如下东西:左边有多少多余的右括号,右边有多少多余的左括号,同时为了反转操作, ...

  8. BZOJ 2329/2209 [HNOI2011]括号修复 (splay)

    题目大意: 让你维护一个括号序列,支持 1.区间修改为同一种括号 2.区间内所有括号都反转 3.翻转整个区间,括号的方向不变 4.查询把某段区间变为合法的括号序列,至少需要修改多少次括号 给跪了,足足 ...

  9. BZOJ2329 [HNOI2011]括号修复

    把左括号看做$1$,右括号看做$-1$,于是查询操作等于查询一个区间左边右边最大(最小)子段和 支持区间翻转,反转,覆盖操作...注意如果有覆盖操作,之前的操作全部作废了...于是在下传标记的时候要最 ...

随机推荐

  1. Beta阶段敏捷冲刺报告-DAY1

    Beta阶段敏捷冲刺报告-DAY1 Scrum Meeting 敏捷开发日期 2017.11.2 讨论时间 20:30 讨论地点 下课路上以及院楼侧门 参会人员 项目组全体成员 会议内容 附加功能讨论 ...

  2. Django 测试驱动开发

    第一章 1.编写functional_tests.py from selenium import webdriver browser = webdriver.Firefox() browser.get ...

  3. stringify 字符串转化成json方法

    参照原文:http://www.cnblogs.com/damonlan/ http://www.jb51.net/article/29893.htm stringify的作用主要是序列化对象(转化为 ...

  4. Ubuntu server 16.04 中文版 终端不能显示中文的解决办法探讨

    对于刚安装成功的Ubuntu server 16.04中文版,在终端显示中文的地方总是出现菱形的图标,看来该版本内置终端暂时不支持中文显示, 还是本人不知道具体操作配置,现通过百度查找以下几个解决方案 ...

  5. Clover3(可以让Windows Explorer像浏览器一样有标签页)

    这不是广告!!! 下载地址:http://cn.ejie.me/ 效果图:

  6. python 模块部分补充知识

    一.hashlib hashlib 模块主要用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法. 实例 ...

  7. SpringMVC之数据传递一

    之前的博客中也说了,mvc中数据传递是最主要的一部分,从url到Controller.从view到Controller.Controller到view以及Controller之间的数据传递.今天主要学 ...

  8. js回顾(DOM中标签的CRUD,表格等)

    01-DOM中的创建和添加标签 02-删除替换克隆标签 03-全选全不选反选 04-新闻字体 05-表格增删 06-动态生成表格 07-表格隔行变色 08-左到右右到左(将左边的标签移动到右边) 09 ...

  9. 05_Linux目录文件操作命令2_我的Linux之路

    这一节我们继续来学习Linux中对文件和目录的操作命令 mkdir 创建目录 mkdir (选项)(参数) 在Linux端可以使用mkdir来创建目录,如果你没有加其他的路径名,那么默认是在当前目录下 ...

  10. global文件中的application_start方法中做: 定时器

    <%@ Application Language="C#" %> <%@ import Namespace="System.Data" %&g ...