●BZOJ 2329 [HNOI2011]括号修复.cpp
题链:
#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的更多相关文章
- BZOJ 2329: [HNOI2011]括号修复( splay )
把括号序列后一定是))))((((这种形式的..所以维护一个最大前缀和l, 最大后缀和r就可以了..答案就是(l+1)/2+(r+1)/2...用splay维护,O(NlogN). 其实还是挺好写的, ...
- BZOJ 2329: [HNOI2011]括号修复 [splay 括号]
题目描述 一个合法的括号序列是这样定义的: 空串是合法的. 如果字符串 S 是合法的,则(S)也是合法的. 如果字符串 A 和 B 是合法的,则 AB 也是合法的. 现在给你一个长度为 N 的由‘(' ...
- 【BZOJ】2329: [HNOI2011]括号修复(splay+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=2329 和前一题一样,不就多了个replace操作吗.好,就打一下. 然后交上去wa了........ ...
- 2329: [HNOI2011]括号修复 - BZOJ
恶心的splay,打标记的时候还有冲突,要特别小心 上次写完了,查了半天没查出错来,于是放弃 今天对着标程打代码,终于抄完了,我已经不想再写了 const maxn=; type node=recor ...
- 2329: [HNOI2011]括号修复
传送魔法 一开始以为可以直接线段树的,好像还是不行……还是得用Spaly,然后就没啥了. #include<cstdio> #include<algorithm> #defin ...
- bzoj千题计划222:bzoj2329: [HNOI2011]括号修复(fhq treap)
http://www.lydsy.com/JudgeOnline/problem.php?id=2329 需要改变的括号序列一定长这样 :)))((( 最少改变次数= 多余的‘)’/2 [上取整] + ...
- 【BZOJ2329/2209】[HNOI2011]括号修复/[Jsoi2011]括号序列 Splay
[BZOJ2329/2209][HNOI2011]括号修复/[Jsoi2011]括号序列 题解:我们的Splay每个节点维护如下东西:左边有多少多余的右括号,右边有多少多余的左括号,同时为了反转操作, ...
- BZOJ 2329/2209 [HNOI2011]括号修复 (splay)
题目大意: 让你维护一个括号序列,支持 1.区间修改为同一种括号 2.区间内所有括号都反转 3.翻转整个区间,括号的方向不变 4.查询把某段区间变为合法的括号序列,至少需要修改多少次括号 给跪了,足足 ...
- BZOJ2329 [HNOI2011]括号修复
把左括号看做$1$,右括号看做$-1$,于是查询操作等于查询一个区间左边右边最大(最小)子段和 支持区间翻转,反转,覆盖操作...注意如果有覆盖操作,之前的操作全部作废了...于是在下传标记的时候要最 ...
随机推荐
- wireshark抓包分析tcp连接与断开
其实对于网络通信的学习,最好还是能够自己抓到包详细地一下,不然只单单通过文字和图的描述印象不够深刻.本文通过实际的抓包操作来看一下tcp的连接与断开是怎样的. 首先需要去https://www.wir ...
- JAVA_SE基础——31.this关键字
黑马程序员入学blog... 也算是学习笔记体会. this的通俗解释: 有一个A类,一个B方法,一个C变量,其中B和C都在类A中 this.B()就是调用A类中的B方法 this.C=1(假设C是一 ...
- LightningChart最新版 v.8.3 全新发布,新功能使用教程。
LightningChart最新版v.8.3全新发布,主要介绍以下五个新功能及使用教程. 1. 网格模型,三角鼠标追踪 Tracing MeshModels with mouse. Traced ...
- nodeJS基于smtp发邮件
邮件的协议smtp是tcp/ip族中的一个协议,所以我们这次考虑使用net模块来发送邮件. const net = require('net') const assert = require('ass ...
- B树和B+树的插入、删除图文详解
简介:本文主要介绍了B树和B+树的插入.删除操作.写这篇博客的目的是发现没有相关博客以举例的方式详细介绍B+树的相关操作,由于自身对某些细节也感到很迷惑,通过查阅相关资料,对B+树的操作有所顿悟,写下 ...
- 使用location.href跳转页面在火狐浏览器中报错404
HTML文件中引入外部js文件,在该js文件里用window.location.href跳转相对路径下的html地址,火狐浏览器会报错404,而谷歌浏览器却显示正常·,分析了一下原因:在识别相对路径时 ...
- Python内置函数(38)——zip
英文文档: zip(*iterables) Make an iterator that aggregates elements from each of the iterables. Returns ...
- api-gateway实践(09)支持rest服务注册
一.GET-GET 1.前端定义 2.后端定义 2.1.基础定义 2.2.path参数.head参数.query参数 2.3.常量参数 2.4.系统参数 2.5.结果定义 二.POST-POST 1. ...
- GIT入门笔记(1)- Git的基本概念
一.概念和定义 1.git是什么 许多人习惯用复制整个项目目录的方式来保存不同的项目版本,或许还会改名加上备份时间以示区别.这么做唯一的好处就是简单.不过坏处也不少:有时候会混淆所在的工作目录,一旦弄 ...
- 阿里云API网关(3)快速入门(调用 API)
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...