設\(nd[4]\)
0——多出來的右括號
1——多出來的左括號
2——取反後多出來的右括號
3——取反後多出來的左括號
這樣一來
swap: swap(0,3),swap(1,2),swap(sn[0],sn[1])
invert: swap(0,2),swap(1,3),val[k]^=1
replace: v<-siz[k],v+2^1<-siz[k],v^1<-0,v+2<-0
注意一下運算優先順序就好
#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"
using namespace std;
const int maxn=1e5+5;
int n,m,cnt,root;
char ch[maxn];
int val[maxn],rev[maxn],sn[2][maxn],siz[maxn];
int nd[4][maxn],tag3[maxn];
bool tag1[maxn],tag2[maxn];
int cret(int v)
void pushdown(int k)
if(tag2[k])if(tag1[k])tag1[k]=tag2[k]=0;
tag3[k]=-1;
return;
}void pushup(int k)
void dro(int k,int v,int &x,int &y)
pushdown(k);
if(siz[sn[0][k]]else y=k,dro(sn[0][k],v,x,sn[0][k]);
pushup(k);
return;
}int un(int x,int y)
pushdown(y);
sn[0][y]=un(x,sn[0][y]);
pushup(y);
return y;
}void slv0(int l,int r)
void slv1(int l,int r)
void slv2(int l,int r)
void slv3(int l,int r,int kd)
int main()
return 0;
}
HNOI2011 括號修復
乙個合法的括號序列是這樣定義的 空串是合法的。如果字串 s 是合法的,則 s 也是合法的。如果字串 a 和 b 是合法的,則 ab 也是合法的。現在給你乙個長度為 n 的由 和 組成的字串,位置標號從 1 到 n。對這個字串有下列四種操作 replace a b c 將 a,b 之間的所有括號改成 ...
HNOI2011 括號修復 Splay
題面 bzoj2329 解析要支援區間翻轉,就可以想到splay了 但是要維護什麼資訊才能得到答案呢,將 看作1,看作 1,記字首最大和為 lx 字尾最小和為 rn 那麼 ans left lceil frac right rceil left lceil left frac right right...
HNOI2011 數學作業
hnoi2011 數學作業 小 c 數學成績優異,於是老師給小 c 留了一道非常難的數學作業題 給定正整數 n 和 m 要求計算concatenate 1.n mod m 的值,其中 concatenate 1.n 是將所有正整數 1,2,n順序連線起來得到的數。例如,n 13,concatenat...