BZOJ2329: [HNOI2011]括号修复(Splay)
解题思路:
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)相关推荐
- UOJ#31. 【UR #2】猪猪侠再战括号序列 splay
显然可以直接凑左面全是左括号,右面全是右括号的情况. 然后区间翻转就用 splay 模拟好了. splay 的时候一定注意一点: 如果没有调用 find(x),就一定要手动把 x 及其祖先的节点 pu ...
- BZOJ2209 [Jsoi2011]括号序列 splay
原文链接http://www.cnblogs.com/zhouzhendong/p/8093556.html 题目传送门 - BZOJ2209 题解 我太弱了,调出这题感觉都要吐了. 题解懒得写了. ...
- BZOJ2209: [Jsoi2011]括号序列
BZOJ2209: [Jsoi2011]括号序列 Description Input 输入数据的第一行包含两个整数N和Q,分别表示括号序列的长度,以及操作的个数. 第二行包含一个长度为N的括号序列. ...
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
- 平衡二叉树 treap
treap通过左右旋维护了一个二叉查找树,根据随机的优先级建立满足优先级大根堆的二叉查找树,在实践中有不错的食府,code也简单. cogs1829 普通平衡树 题目大意:进行插入.删除.名次.前驱后 ...
- 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 ...
- python 去除str的引号 去除括号_用python进行图像修复与去除水印
有时候我们在看知乎的时候,会突然发现一张很好看的图片,想据为己有,猥猥琐琐的准备长按图片保存,发现图片上居然带了水印,这个时候该怎么办呢?哈哈哈,直接裁剪掉不就好了吗~~~ 但是,作为一个新时代的程序 ...
- 注册修复动态链接库DLL文件
所有DLL 文件一般都在system32 目录下,如果能把system32 目录下所有DLL 文件都注册一下,那么不就可以解决大多数由DLL 文件引起的问题了吗?怎么才能3秒钟找到DLL文件的&quo ...
- 【洛谷P3369】普通平衡树(splay)
emmmmm直接丢代码了 #include<iostream> #include<cstdio> #include<cstring> #include<str ...
最新文章
- 红外发送管的角度特性测试
- mysql正确打开方式_MySQL中MVCC的正确打开方式
- LightOJ - 1140 How Many Zeroes?
- VMware网络设置
- docker安装nacos并配置mysql数据库教程
- STM32F4 使用 JFlash 加密后无法再擦除了
- 微软半日游,和CSDN同学们走进名企
- Thinkpad E430C 跳过电池检测更新bios
- python关联分析库_使用Python进行数据关联分析
- Ubuntu安装虚拟机
- java string.concat_Java String concat() 使用方法及示例
- 【OpenCV】HSV颜色识别-HSV基本颜色分量范围
- OpenCV学习心得:Scalar()的几种使用方法
- 浅谈敏捷思想-08.从产品愿景到用户故事地图
- ElementUI分页与增删改合并
- 3c认证是什么,3C认证的6个步骤详解
- cmd执行python脚本命令大全_Python脚本实现在cmd执行相关命令
- 2022年福建最新中级消防员模拟试题题库及答案
- 电脑控制android 电视,生活小技巧 | 手机怎么投屏到电视/电脑
- linux win10 引导修复,windows10 安装后,grub 引导修复(亲自实验)