题解:

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);
}
}

最新文章

  1. 安开发卓之Notification(一)代码直接能用
  2. C++快速入门系列教程
  3. shell命令bc
  4. PHP中ob系列函数整理
  5. CentOS学习笔记--账号管理与权限配置
  6. 【递归】油桶问题dp
  7. map容器对象插入数据的4种方式
  8. Hibernate框架增删改查测试类归为一个类
  9. 页面打开直接执行a点击事件
  10. Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式
  11. 论文泛读 A Novel Ensemble Learning-based Approach for Click Fraud Detection in Mobile Advertising [1/10]
  12. MYSQL InnoDB Cluster
  13. 显卡、显卡驱动、CUDA、cuDNN之间的关系
  14. Log4net PatternLayout 参数
  15. ActionContext和ServletActionContext小结(转)
  16. jQuery.Validate 验证,以及 remote验证, 多参数传递
  17. spring利用注解方式实现Java读取properties属性值
  18. Gradle学习系列(三)
  19. Android研究之动态创建UI界面具体解释
  20. 高性能Web服务器Nginx的配置与部署研究(15)Upstream负载均衡模块

热门文章

  1. Win10 Edge浏览器怎么重装 Win10重装Edge浏览器
  2. loj 诗歌
  3. The equation (扩展欧几里得)题解
  4. HDU 2157(矩阵快速幂)题解
  5. 智能边缘计算,让IoT有大智慧
  6. ubuntu 14.04 安装 glog
  7. StringBuffer中的sBuffer.delete(0,4);
  8. TeamViewer 说明截图
  9. Qt_OpenGL_教程
  10. Python mysql-SQL概要