解题思路:

Replace、Swap、Invert都可以使用Splay完美解决(只需要解决一下标记冲突就好了)。

最后只需要统计左右括号冲突就好了。

相当于动态统计最大前缀合和最小后缀和。

因为支持翻转反转操作,翻转标记或取反就好了。

代码:

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #define lll tr[spc].ch[0]
  5 #define rrr tr[spc].ch[1]
  6 #define ls ch[0]
  7 #define rs ch[1]
  8 typedef long long lnt;
  9 const int N=300000;
 10 struct trnt{
 11     int ch[2];
 12     int fa;
 13     int wgt;
 14     int val;
 15     int sum;
 16     int mxp;
 17     int mnp;
 18     int mxs;
 19     int mns;
 20     int lzt;
 21     bool rev;
 22     bool ant;
 23 }tr[N];
 24 int n,m;
 25 int siz;
 26 int root;
 27 int num[N];
 28 char cmd[N];
 29 bool whc(int spc)
 30 {
 31     return tr[tr[spc].fa].rs==spc;
 32 }
 33 void pushup(int spc)
 34 {
 35     tr[spc].wgt=1;
 36     if(lll)
 37         tr[spc].wgt+=tr[lll].wgt;
 38     if(rrr)
 39         tr[spc].wgt+=tr[rrr].wgt;
 40     tr[spc].sum=tr[spc].val;
 41     if(lll)
 42         tr[spc].sum+=tr[lll].sum;
 43     if(rrr)
 44         tr[spc].sum+=tr[rrr].sum;
 45     tr[spc].mxp=tr[spc].mxs=std::max(tr[spc].sum,0);
 46     tr[spc].mnp=tr[spc].mns=std::min(0,tr[spc].sum);
 47     if(lll)
 48     {
 49         tr[spc].mxp=std::max(tr[spc].mxp,std::max(tr[lll].mxp,tr[lll].sum+tr[spc].val));
 50         tr[spc].mnp=std::min(tr[spc].mnp,std::min(tr[lll].mnp,tr[lll].sum+tr[spc].val));
 51         tr[spc].mxs=std::max(tr[spc].mxs,std::max(tr[rrr].sum+tr[spc].val,tr[spc].val+tr[lll].mxs+tr[rrr].sum));
 52         tr[spc].mns=std::min(tr[spc].mns,std::min(tr[rrr].sum+tr[spc].val,tr[spc].val+tr[lll].mns+tr[rrr].sum));
 53     }
 54     if(rrr)
 55     {
 56         tr[spc].mxs=std::max(tr[spc].mxs,std::max(tr[rrr].mxs,tr[rrr].sum+tr[spc].val));
 57         tr[spc].mns=std::min(tr[spc].mns,std::min(tr[rrr].mns,tr[rrr].sum+tr[spc].val));
 58         tr[spc].mxp=std::max(tr[spc].mxp,std::max(tr[lll].sum+tr[spc].val,tr[spc].val+tr[lll].sum+tr[rrr].mxp));
 59         tr[spc].mnp=std::min(tr[spc].mnp,std::min(tr[lll].sum+tr[spc].val,tr[spc].val+tr[lll].sum+tr[rrr].mnp));
 60     }
 61     return ;
 62 }
 63 void trr(int spc)
 64 {
 65     if(!spc)
 66         return ;
 67     std::swap(lll,rrr);
 68     std::swap(tr[spc].mxp,tr[spc].mxs);
 69     std::swap(tr[spc].mnp,tr[spc].mns);
 70     tr[spc].rev^=1;
 71     return ;
 72 }
 73 void anti(int spc)
 74 {
 75     if(!spc)
 76         return ;
 77     tr[spc].val*=-1;
 78     tr[spc].sum*=-1;
 79     tr[spc].mxp*=-1;
 80     tr[spc].mnp*=-1;
 81     tr[spc].mxs*=-1;
 82     tr[spc].mns*=-1;
 83     std::swap(tr[spc].mxp,tr[spc].mnp);
 84     std::swap(tr[spc].mxs,tr[spc].mns);
 85     tr[spc].ant^=1;
 86     return ;
 87 }
 88 void chg(int spc,int v)
 89 {
 90     if(!spc)
 91         return ;
 92     tr[spc].ant=false;
 93     tr[spc].val=v;
 94     tr[spc].lzt=v;
 95     tr[spc].sum=v*tr[spc].wgt;
 96     if(v==1)
 97     {
 98         tr[spc].mnp=0;
 99         tr[spc].mns=0;
100         tr[spc].mxp=v*tr[spc].wgt;
101         tr[spc].mxs=v*tr[spc].wgt;
102     }else{
103         tr[spc].mxp=0;
104         tr[spc].mxs=0;
105         tr[spc].mnp=v*tr[spc].wgt;
106         tr[spc].mns=v*tr[spc].wgt;
107     }
108     return ;
109 }
110 void pushdown(int spc)
111 {
112     if(tr[spc].rev)
113     {
114         trr(lll);
115         trr(rrr);
116         tr[spc].rev=false;
117     }
118     if(tr[spc].lzt)
119     {
120         chg(lll,tr[spc].lzt);
121         chg(rrr,tr[spc].lzt);
122         tr[spc].lzt=0;
123     }
124     if(tr[spc].ant)
125     {
126         anti(lll);
127         anti(rrr);
128         tr[spc].ant=false;
129     }
130     return ;
131 }
132 void recal(int spc)
133 {
134     if(tr[spc].fa)
135         recal(tr[spc].fa);
136     pushdown(spc);
137     return ;
138 }
139 void rotate(int spc)
140 {
141     int f=tr[spc].fa;
142     bool k=whc(spc);
143     tr[f].ch[k]=tr[spc].ch[!k];
144     tr[spc].ch[!k]=f;
145     tr[tr[f].fa].ch[whc(f)]=spc;
146     tr[spc].fa=tr[f].fa;
147     tr[f].fa=spc;
148     tr[tr[f].ch[k]].fa=f;
149     pushup(f);
150     pushup(spc);
151     return ;
152 }
153 void splay(int spc,int f)
154 {
155     recal(spc);
156     while(tr[spc].fa!=f)
157     {
158         int ft=tr[spc].fa;
159         if(tr[ft].fa==f)
160         {
161             rotate(spc);
162             break;
163         }
164         if(whc(spc)^whc(ft))
165             rotate(spc);
166         else
167             rotate(ft);
168         rotate(spc);
169     }
170     if(!f)
171         root=spc;
172     return ;
173 }
174 void Build(int l,int r,int &spc,int f)
175 {
176     if(l>r)
177         return ;
178     int mid=(l+r)>>1;
179     spc=++siz;
180     tr[spc].val=num[mid];
181     tr[spc].fa=f;
182     Build(l,mid-1,lll,spc);
183     Build(mid+1,r,rrr,spc);
184     pushup(spc);
185     return ;
186 }
187 int plc(int spc,int k)
188 {
189     pushdown(spc);
190     if(tr[lll].wgt>=k)
191         return plc(lll,k);
192     if(tr[lll].wgt+1==k)
193         return spc;
194     return plc(rrr,k-tr[lll].wgt-1);
195 }
196 void rush(int l,int r)
197 {
198     l=plc(root,l);
199     r=plc(root,r+2);
200     splay(l,0);
201     splay(r,root);
202     return ;
203 }
204 int main()
205 {
206     scanf("%d%d",&n,&m);
207     scanf("%s",cmd+1);
208     for(int i=1;i<=n;i++)
209         num[i]=((cmd[i]==')')<<1)-1;
210     Build(0,n+1,root,0);
211     while(m--)
212     {
213         int l,r;
214         scanf("%s",cmd+1);
215         scanf("%d%d",&l,&r);
216         rush(l,r);
217         if(cmd[1]=='R')
218         {
219             scanf("%s",cmd+1);
220             chg(tr[tr[root].rs].ls,((cmd[1]==')')<<1)-1);
221         }else if(cmd[1]=='S')
222             trr(tr[tr[root].rs].ls);
223         else if(cmd[1]=='I')
224             anti(tr[tr[root].rs].ls);
225         else{
226             int spc=tr[tr[root].rs].ls;
227             printf("%d\n",(tr[spc].mxp+1)/2+(-tr[spc].mns+1)/2);
228         }
229         pushup(tr[root].rs);
230         pushup(root);
231     }
232     return 0;
233 }

转载于:https://www.cnblogs.com/blog-Dr-J/p/10116235.html

BZOJ2329: [HNOI2011]括号修复(Splay)相关推荐

  1. UOJ#31. 【UR #2】猪猪侠再战括号序列 splay

    显然可以直接凑左面全是左括号,右面全是右括号的情况. 然后区间翻转就用 splay 模拟好了. splay 的时候一定注意一点: 如果没有调用 find(x),就一定要手动把 x 及其祖先的节点 pu ...

  2. BZOJ2209 [Jsoi2011]括号序列 splay

    原文链接http://www.cnblogs.com/zhouzhendong/p/8093556.html 题目传送门 - BZOJ2209 题解 我太弱了,调出这题感觉都要吐了. 题解懒得写了. ...

  3. BZOJ2209: [Jsoi2011]括号序列

    BZOJ2209: [Jsoi2011]括号序列 Description Input 输入数据的第一行包含两个整数N和Q,分别表示括号序列的长度,以及操作的个数. 第二行包含一个长度为N的括号序列. ...

  4. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  5. 平衡二叉树 treap

    treap通过左右旋维护了一个二叉查找树,根据随机的优先级建立满足优先级大根堆的二叉查找树,在实践中有不错的食府,code也简单. cogs1829 普通平衡树 题目大意:进行插入.删除.名次.前驱后 ...

  6. 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 ...

  7. python 去除str的引号 去除括号_用python进行图像修复与去除水印

    有时候我们在看知乎的时候,会突然发现一张很好看的图片,想据为己有,猥猥琐琐的准备长按图片保存,发现图片上居然带了水印,这个时候该怎么办呢?哈哈哈,直接裁剪掉不就好了吗~~~ 但是,作为一个新时代的程序 ...

  8. 注册修复动态链接库DLL文件

    所有DLL 文件一般都在system32 目录下,如果能把system32 目录下所有DLL 文件都注册一下,那么不就可以解决大多数由DLL 文件引起的问题了吗?怎么才能3秒钟找到DLL文件的&quo ...

  9. 【洛谷P3369】普通平衡树(splay)

    emmmmm直接丢代码了 #include<iostream> #include<cstdio> #include<cstring> #include<str ...

最新文章

  1. 红外发送管的角度特性测试
  2. mysql正确打开方式_MySQL中MVCC的正确打开方式
  3. LightOJ - 1140 How Many Zeroes?
  4. VMware网络设置
  5. docker安装nacos并配置mysql数据库教程
  6. STM32F4 使用 JFlash 加密后无法再擦除了
  7. 微软半日游,和CSDN同学们走进名企
  8. Thinkpad E430C 跳过电池检测更新bios
  9. python关联分析库_使用Python进行数据关联分析
  10. Ubuntu安装虚拟机
  11. java string.concat_Java String concat() 使用方法及示例
  12. 【OpenCV】HSV颜色识别-HSV基本颜色分量范围
  13. OpenCV学习心得:Scalar()的几种使用方法
  14. 浅谈敏捷思想-08.从产品愿景到用户故事地图
  15. ElementUI分页与增删改合并
  16. 3c认证是什么,3C认证的6个步骤详解
  17. cmd执行python脚本命令大全_Python脚本实现在cmd执行相关命令
  18. 2022年福建最新中级消防员模拟试题题库及答案
  19. 电脑控制android 电视,生活小技巧 | 手机怎么投屏到电视/电脑
  20. linux win10 引导修复,windows10 安装后,grub 引导修复(亲自实验)

热门文章

  1. pyspark subtract代码示例
  2. Linux脚本:xjps查看各个节点java进程
  3. hbase集群重启后异常删除zookeeper中的元数据
  4. 【软考-软件设计师】计算机存储系统
  5. Redis缓存高可用集群哨兵模式详解
  6. jQuery easyUI--弹窗的使用
  7. GitLab添加SSH Keys并连接(windows)
  8. Qt工程文件Pro中判断Qt版本号
  9. Qt之创建并使用共享库
  10. 安装Ubuntu 20.04.1 LTS (Focal Fossa)到U盘并安装ros2