bzoj2209
题解:
splay打标机
往下传递
记录x,y为化简后,区间有多少(,)
代码:
#include<bits/stdc++.h>
const int N=;
using namespace std;
int n,m,t,l,r,c[N][],sum[N],a[N],sz[N],fa[N],rt,rev[N],ops[N];
char s[N];
struct node
{
int l0,l1,r0,r1;
}val[N];
void maintain(int k)
{
int l=c[k][],r=c[k][];
sum[k]=a[k]+sum[l]+sum[r];sz[k]=sz[l]+sz[r]+;
val[k].l0=min(val[l].l0,sum[l]+a[k]+val[r].l0);
val[k].l1=max(val[l].l1,sum[l]+a[k]+val[r].l1);
val[k].r0=min(val[r].r0,sum[r]+a[k]+val[l].r0);
val[k].r1=max(val[r].r1,sum[r]+a[k]+val[l].r1);
}
void rever(int k)
{
rev[k]^=;
swap(val[k].l0,val[k].r0);
swap(val[k].l1,val[k].r1);
}
void opsite(int k)
{
ops[k]^=;sum[k]=-sum[k];a[k]=-a[k];
swap(val[k].l0,val[k].l1);
swap(val[k].r0,val[k].r1);
val[k].l0=-val[k].l0;val[k].l1=-val[k].l1;
val[k].r0=-val[k].r0;val[k].r1=-val[k].r1;
}
void pushdown(int k)
{
if (rev[k])
{
swap(c[k][],c[k][]);rev[k]=;
rever(c[k][]);rever(c[k][]);
}
if (ops[k])
{
opsite(c[k][]);
opsite(c[k][]);
ops[k]=;
}
}
void rotate(int x,int &k)
{
int y=fa[x],z=fa[y],r=(x==c[y][])?:;
if (y==k)k=x;
else if (c[z][]==y)c[z][]=x;
else c[z][]=x;
fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
c[y][r^]=c[x][r];c[x][r]=y;
maintain(y);maintain(x);
}
void splay(int x,int &k)
{
while (x!=k)
{
int y=fa[x],z=fa[y];
if (y!=k)
if ((c[y][]==x)^(c[z][]==y))rotate(x,k);
else rotate(y,k);
rotate(x,k);
}
}
int find(int k,int rst)
{
pushdown(k);
int l=c[k][],r=c[k][];
if (sz[l]+==rst)return k;
if (sz[l]>=rst)return find(l,rst);
return find(r,rst-sz[l]-);
}
void build(int &k,int l,int r,int last)
{
if (l>r)
{
k=;
return;
}
k=(l+r)>>;
fa[k]=last;
if (l==r)
{
sum[k]=a[l];sz[k]=;
if (a[l]<)val[k].l0=val[k].r0=-;
if (a[l]>)val[k].l1=val[k].r1=;
return;
}
build(c[k][],l,k-,k);
build(c[k][],k+,r,k);
maintain(k);
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%s",s+);
for (int i=;i<=n+;i++)
if (s[i]=='(')a[i]=;else a[i]=-;
build(rt,,n+,);
while (m--)
{
scanf("%d%d%d",&t,&l,&r);
l=find(rt,l);r=find(rt,r+);
splay(l,rt);splay(r,c[l][]);
int k=c[r][];
if (t==)printf("%d\n",(val[k].r1+)/-(val[k].l0-)/);
if (t==)opsite(k);
if (t==)rever(k);
}
}
bzoj2209的更多相关文章
- BZOJ2209 [Jsoi2011]括号序列 splay
原文链接http://www.cnblogs.com/zhouzhendong/p/8093556.html 题目传送门 - BZOJ2209 题解 我太弱了,调出这题感觉都要吐了. 题解懒得写了. ...
- BZOJ2209: [Jsoi2011]括号序列
传送门 splay练习. 考虑把括号序列转化成类似于区间最大/最小值的情况. 显然我们可以知道括号序列消完的情况肯定是$a$个)和$b$个(,那么把这些括号全部合法化的代价显然就是$\frac{a+1 ...
- bzoj2209 2329
括号序列的经典做法把(看成1,)看成-1匹配的括号序列即任意前缀和都非负我们先解决静态的问题,给定一段括号序列求最少修改次数我们先找出最大后缀和a和最小前缀和b之间一定可以不相交显然a+|b|个括号是 ...
- bzoj2209 括号序列
题意:给你一个括号序列.操作1:询问需要更改多少个括号使之匹配. 操作2:反转序列,左括号变成右括号. 操作3:翻转序列,倒置. 标程: #include<cstdio> #include ...
- PKUSC2018训练日程(4.18~5.30)
(总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...
随机推荐
- HDU3652 B-number(数位DP)题解
思路: 这里的状态分为3种,无13和末尾的1,无13且末尾为1,有13,然后DFS 等我搞清楚数位DP就来更新Orz 代码: #include<iostream> #include< ...
- rvm 安装ruby环境报错curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
很可能是rvm仓库版本过低,运行以下命令: rvm get head
- UDP的socketasynceventargs
C# 使用 SocketAsyncEventArgs 实现UdpSocket系列 http://www.cnblogs.com/zwq194/archive/2012/10/30/2746393.ht ...
- asp.net <asp:Repeater>下的 asp:LinkButton CommandArgument点击事件
前台 <asp:Repeater ID="rptData" runat="server" OnItemCommand="rptData_Item ...
- RTC(x86)
RTC 原创,转载请写明出处. 一直以来想写一篇关于RTC的总结,可是人太懒,在读完John Z. Sonmez大伽的<软技能代码之外的生存技能>后,终于下定决心,完成这项早已计划中的任务 ...
- Ubuntu 16.04 kinetic 编译指定包
编译指定包 catkin_make -DCATKIN_WHITELIST_PACKAGES=baoming 使用上述命令后catkin_make会一直编译上面那个包,想要编译全部包,使用 catkin ...
- Ubuntu16.04下的主题美化
1.先下载桌面外观管理工具 sudo apt-get install unity-tweak-tool 2.gnome工具 sudo apt-get install gnome-tweak-tool ...
- MSVC_代码优化
测试环境: Win7x64 cn_visual_studio_2010_ultimate_x86_dvd_532347.iso qt-opensource-windows-x86-msvc2010_o ...
- Centos修改系统语言
使用man page帮助时,发现居然是中文的,不过想想即便英语再水,也要逼着自己去适应.于是百度找了一下修改系统语言的方法. 首先使用 locale 命令查看当前的系统语言 然后修改时一般有两种方法, ...
- Android 利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果
本文主要介绍如何利用ViewPager.Fragment.PagerTabStrip实现多页面滑动效果.即google play首页.新浪微博消息(at.评论.私信.广播)页面的效果.ViewPage ...