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

SOL:

  我们用平衡树维护就好啦。

   

// getlazy
#include<bits/stdc++.h>
using namespace std;
inline int rop() {
    static int x=23333;
    return x^=x<<13,x^=x>>17,x^=x<<5;
} 
#define Mid (l+r>>1) 
#define rr NULL
struct T{
    int val,key,rev,usd,siz;
    T* son[2];
    inline T(int x) {
        key=x; val=rop(); rev=0; son[0]=son[1]=rr; 
        siz=1; usd=(x==1);
    }
    inline void up() {
        siz=1; usd=(key==1);
        if (son[0]) {siz+=son[0]->siz;usd|=son[0]->usd;}
        if (son[1]) {siz+=son[1]->siz;usd|=son[1]->usd;}
    }
    inline void down() {
        if (!rev) return;
        swap(son[0],son[1]);
        if (son[0]) son[0]->rev^=1;
        if (son[1]) son[1]->rev^=1; 
        rev=0; 
    }
}*rt,*x,*y,*z;
#define N 200007
void split(T* now,int k,T* &x,T* &y) {
    if (!now)  { x=rr,y=rr; return;}
    now->down();
    int cmp=(now->son[0]?now->son[0]->siz:0)+1;
    if (k<cmp) y=now,split(y->son[0],k,x,y->son[0]);
    else x=now,split(x->son[1],k-cmp,x->son[1],y);
    now->up();
}
T* merge(T* x,T* y) {
    if (!x) return y; if (!y) return x;
    x->down(); y->down();
    if (x->val<y->val) {
        x->son[1]=merge(x->son[1],y);
        x->up(); return x;
    } y->son[0]=merge(x,y->son[0]);
    y->up(); return y;
}
int find(T* x){
    x->down();
    if (x->son[0]&&x->son[0]->usd) return find(x->son[0]);
    if (x->key>0) return (x->son[0]?x->son[0]->siz:0)+1;
    return (x->son[0]?x->son[0]->siz:0)+1+find(x->son[1]);
}
int n,a[N],t;
T* build(int l,int r){
    if (l>r) return rr;
    T* x=new T(a[Mid]);
    x->son[0]=build(l,Mid-1);
    x->son[1]=build(Mid+1,r);
    x->up(); return x;
}
#define in(x) (x=='('||x==')')
#define pu(x) (x=='('?1:-1)
int sum=0,l[N],r[N],tot;
int read(int *a) {
    int t=0;char c=getchar();
    for (;!in(c);c=getchar());
    for (;in(c);c=getchar()) a[++t]=pu(c),sum+=a[t];
    if (sum) return 0;
    return t;
}
void write(int x){if (x<10) {putchar('0'+x); return;} write(x/10); putchar('0'+x%10);}
inline void writeln(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar('
'); }
inline void writel(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar(' '); }
void dfs(T* x){
    if (!x) return;
    x->down();
    if (x->son[0]) dfs(x->son[0]);
    writel(x->key);
    if (x->son[1]) dfs(x->son[1]);
}
signed main () {
//    freopen("a.in","r",stdin);
    n=read(a);
    if (n==0) {writeln(-1); return 0;}
    rt=build(1,n);
//    dfs(rt),putchar('
');
    for (int i=1;i<=n;i++) {
        split(rt,1,x,rt);
        if (sum+(x->key)<0) {
            rt=merge(x,rt);
            t=find(rt);
            split(rt,t,y,z);
            y->rev^=1;
            rt=merge(y,z);
//            dfs(rt),putchar('
');
//            writel(i); writeln(i+t-1);
            l[++tot]=i; r[tot]=i+t-1;
            split(rt,1,x,rt);
        }
        sum+=x->key;
    }
    writeln(tot);
    for (int i=1;i<=tot;i++)
     writel(l[i]),writeln(r[i]);
    return 0;
}
原文地址:https://www.cnblogs.com/rrsb/p/8849301.html