UOJ#31. 【UR #2】猪猪侠再战括号序列 splay
显然可以直接凑左面全是左括号,右面全是右括号的情况.
然后区间翻转就用 splay 模拟好了.
splay 的时候一定注意一点:
如果没有调用 find(x),就一定要手动把 x 及其祖先的节点 pushdown.
code;
#include <bits/stdc++.h> #define N 100009 #define ll long long #define lson s[x].ch[0] #define rson s[x].ch[1] #define setIO(s) freopen(s".in","r",stdin) using namespace std; char str[N<<1]; int n,tot,root,A[N<<1],sta[N<<1]; struct node { int ch[2],rev,f,w,pos,si; }s[N<<1]; int get(int x) { return s[s[x].f].ch[1]==x; } void mark(int x) {swap(lson,rson),s[x].rev^=1; } void pushup(int x) {int l=lson,r=rson; s[x].si=s[l].si+s[r].si+1; if(s[x].w==1) s[x].pos=x; else s[x].pos=0; if(s[l].pos) s[x].pos=s[l].pos; if(s[r].pos) s[x].pos=s[r].pos; } void pushdown(int x) { if(s[x].rev) {if(lson) mark(lson); if(rson) mark(rson); s[x].rev=0; } } void rotate(int x) { int old=s[x].f,fold=s[old].f,which=get(x); s[old].ch[which]=s[x].ch[which^1]; if(s[old].ch[which]) s[s[old].ch[which]].f=old; s[x].ch[which^1]=old,s[old].f=x,s[x].f=fold; if(fold) s[fold].ch[s[fold].ch[1]==old]=x; pushup(old),pushup(x); } void splay(int x,int &tar) {int fa,u=x,v=0; for(sta[++v]=u;u!=tar;u=s[u].f) sta[++v]=s[u].f; for(;v;--v) pushdown(sta[v]); for(u=s[u].f;(fa=s[x].f)!=u;rotate(x)) if(s[fa].f!=u) rotate(get(fa)==get(x)?fa:x); tar=x; } int find(int x,int kth) { pushdown(x); if(s[lson].si+1==kth) return x; else{if(s[lson].si>=kth) return find(lson,kth); else return find(rson,kth-s[lson].si-1); } } int build(int l,int r,int ff) { int mid=(l+r)>>1; int cur=++tot; s[cur].f=ff; s[cur].w=A[mid]; if(mid>l) s[cur].ch[0]=build(l,mid-1,cur); if(r>mid) s[cur].ch[1]=build(mid+1,r,cur); pushup(cur); return cur; } int cnt; int tl[N],tr[N]; int main() { // setIO("input");scanf("%s",str+1),n=strlen(str+1); for(int i=1;i<=n;++i) A[i]=(str[i]=='('?1:-1);root=build(0,n+1,0); for(int i=1;i<=n/2;++i) { int CUR; splay(CUR=find(root,i+1),root); if(s[root].w==1) continue; else{ int PRE=find(root,i); splay(PRE,root); int z=s[s[PRE].ch[1]].pos; splay(z,root); int k=s[s[z].ch[0]].si+1; splay(PRE,root); splay(find(root,k+1),s[PRE].ch[1]); int tmp=s[s[PRE].ch[1]].ch[0]; mark(tmp); ++cnt; tl[cnt]=i,tr[cnt]=k-1; }}printf("%d\n",cnt); for(int i=1;i<=cnt;++i) printf("%d %d\n",tl[i],tr[i]); return 0; }
UOJ#31. 【UR #2】猪猪侠再战括号序列 splay相关推荐
- UOJ#31 【UR #2】猪猪侠再战括号序列
传送门http://uoj.ac/problem/31 大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_CallMeGGBond. 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领域的兴趣:尤其 ...
- UOJ #31 【UR #2】猪猪侠再战括号序列
大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_CallMeGGBond. 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领域的兴趣:尤其是括号序列理论,一度令我沉浸其中,无法自拔.至于OI算法 ...
- [UOJ #31]【UR #2】猪猪侠再战括号序列
题目大意:给你一个长度为$2n$的括号序列,保证$n$个`(`,$n$个`)`.要求输出一种可行方案,通过小于等于$n$的步数,每次交换区间$[x_i,y_i]$(立即交换),使得最后括号序列合法 题 ...
- uoj problem 31 猪猪侠再战括号序列
题目大意: 给定一个长度为2n的括号序列.定义一个关于区间[l,r]的翻转操作为位置平移对调. 即翻转")))()("可以得到"()()))((" 用不超过n次 ...
- 【UR #2】猪猪侠再战括号序列
---恢复内容开始--- 大概就是判断合法的括号序列的问题,进行翻转使其成为合法的括号序列. 1.前缀和的做法:非常妙啊,左括号和右括号分别即为1和-1,合法的组合累加和一定为非负数,而不合法的情况就 ...
- UOJ #31. 【UR #2】猪猪侠再战括号序列
1e5 不一定是nlogn 也可能是o(n) 事实上如果是 1e6 o(n)会跑好久 然后题目中的限制有很大的用处 : nn 个左括号 "(" 和 nn 个右括号 ")& ...
- 【UR #2】 猪猪侠再战括号序列
SOL: 我们用平衡树维护就好啦. // getlazy #include<bits/stdc++.h> using namespace std; inline int rop() {st ...
- BZOJ2209 [Jsoi2011]括号序列 splay
原文链接http://www.cnblogs.com/zhouzhendong/p/8093556.html 题目传送门 - BZOJ2209 题解 我太弱了,调出这题感觉都要吐了. 题解懒得写了. ...
- [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)
[BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个 ...
最新文章
- tf.contrib.layers.fully_connected详解
- 报名即将关闭丨AAAI 2020论文预讲会
- AQS独占式获取同步状态和释放同步状态(源码阅读笔记)
- Android EditText回车不换行
- 【C 语言】二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )
- Windows Server 2008 R2 如何启用WINS服务
- 洛谷P1220 关路灯(区间dp)
- Vue---从后台获取数据vue-resource的使用方法
- 如何访问.then()链中的先前的诺言结果?
- 电子元器件选型——电容
- Expo大作战(四十一)【完】--expo sdk 之 Assets,BarCodeScanner,AppLoading
- 富士通Fujitsu DPK1180K 打印机驱动
- VC++实现会议中阻止屏保、阻止系统自动关闭屏幕、阻止系统待机(附源码)
- 分布式高频量化交易系统架构讲解(企业版,期货ctp,股票xtp,数字货币,附全部源码)(值得收藏)
- 课堂笔记(3) 假设检验 Hypothesis testing
- 计算机组织结构南京大学,南京大学09年计算机组织结构期中考试试题.docx
- 回归分析中的p值和R方哪个更重要?
- FEDformer: Frequency Enhanced Decomposed Transformer for Long-termSeries Forecasting(ICML2022)
- Pandas常用累计、同比、环比等统计方法实践案例
- 基于JAVA图书馆座位预约管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
热门文章
- Python脚本统计每个字符的次数/频数(字频统计)
- Manjaor连接wifi失败,wifi设备状态为unclaimed
- 解决,vlc播放虎牙url只有画面没声音的问题。
- 什么样的网站可以用Joomla搭建
- 转正申精(试用期工作总结)
- ERROR: Cannot install -r requirements.txt (line 2) and tensorflow>=1.14.0 because these package vers
- 调整小组成员架构对外称呼_考虑如何称呼团队成员和经理
- IOS证书申请、上传包管理教程(appuploader)
- 计算机组成原理——组成篇
- 什么蓝牙耳机玩游戏超低延迟?玩游戏超低延迟的蓝牙耳机推荐