显然可以直接凑左面全是左括号,右面全是右括号的情况.

然后区间翻转就用 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相关推荐

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

    传送门http://uoj.ac/problem/31 大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_CallMeGGBond. 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领域的兴趣:尤其 ...

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

    大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_CallMeGGBond. 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领域的兴趣:尤其是括号序列理论,一度令我沉浸其中,无法自拔.至于OI算法 ...

  3. [UOJ #31]【UR #2】猪猪侠再战括号序列

    题目大意:给你一个长度为$2n$的括号序列,保证$n$个`(`,$n$个`)`.要求输出一种可行方案,通过小于等于$n$的步数,每次交换区间$[x_i,y_i]$(立即交换),使得最后括号序列合法 题 ...

  4. uoj problem 31 猪猪侠再战括号序列

    题目大意: 给定一个长度为2n的括号序列.定义一个关于区间[l,r]的翻转操作为位置平移对调. 即翻转")))()("可以得到"()()))((" 用不超过n次 ...

  5. 【UR #2】猪猪侠再战括号序列

    ---恢复内容开始--- 大概就是判断合法的括号序列的问题,进行翻转使其成为合法的括号序列. 1.前缀和的做法:非常妙啊,左括号和右括号分别即为1和-1,合法的组合累加和一定为非负数,而不合法的情况就 ...

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

    1e5 不一定是nlogn 也可能是o(n) 事实上如果是 1e6 o(n)会跑好久 然后题目中的限制有很大的用处 : nn 个左括号 "(" 和 nn 个右括号 ")& ...

  7. 【UR #2】 猪猪侠再战括号序列

    SOL: 我们用平衡树维护就好啦. // getlazy #include<bits/stdc++.h> using namespace std; inline int rop() {st ...

  8. BZOJ2209 [Jsoi2011]括号序列 splay

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

  9. [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)

    [BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个 ...

最新文章

  1. tf.contrib.layers.fully_connected详解
  2. 报名即将关闭丨AAAI 2020论文预讲会
  3. AQS独占式获取同步状态和释放同步状态(源码阅读笔记)
  4. Android EditText回车不换行
  5. 【C 语言】二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )
  6. Windows Server 2008 R2 如何启用WINS服务
  7. 洛谷P1220 关路灯(区间dp)
  8. Vue---从后台获取数据vue-resource的使用方法
  9. 如何访问.then()链中的先前的诺言结果?
  10. 电子元器件选型——电容
  11. Expo大作战(四十一)【完】--expo sdk 之 Assets,BarCodeScanner,AppLoading
  12. 富士通Fujitsu DPK1180K 打印机驱动
  13. VC++实现会议中阻止屏保、阻止系统自动关闭屏幕、阻止系统待机(附源码)
  14. 分布式高频量化交易系统架构讲解(企业版,期货ctp,股票xtp,数字货币,附全部源码)(值得收藏)
  15. 课堂笔记(3) 假设检验 Hypothesis testing
  16. 计算机组织结构南京大学,南京大学09年计算机组织结构期中考试试题.docx
  17. 回归分析中的p值和R方哪个更重要?
  18. FEDformer: Frequency Enhanced Decomposed Transformer for Long-termSeries Forecasting(ICML2022)
  19. Pandas常用累计、同比、环比等统计方法实践案例
  20. 基于JAVA图书馆座位预约管理系统计算机毕业设计源码+数据库+lw文档+系统+部署

热门文章

  1. Python脚本统计每个字符的次数/频数(字频统计)
  2. Manjaor连接wifi失败,wifi设备状态为unclaimed
  3. 解决,vlc播放虎牙url只有画面没声音的问题。
  4. 什么样的网站可以用Joomla搭建
  5. 转正申精(试用期工作总结)
  6. ERROR: Cannot install -r requirements.txt (line 2) and tensorflow>=1.14.0 because these package vers
  7. 调整小组成员架构对外称呼_考虑如何称呼团队成员和经理
  8. IOS证书申请、上传包管理教程(appuploader)
  9. 计算机组成原理——组成篇
  10. 什么蓝牙耳机玩游戏超低延迟?玩游戏超低延迟的蓝牙耳机推荐