BZOJ2329 HNOI2011 括號修復

2022-04-28 21:12:19 字數 1218 閱讀 4766

bzoj

luogu

你需要維護乙個括號序列,支援如下四種操作:

1、把區間\([l,r]\)全部改成(或是)

2、把區間\([l,r]\)翻轉。

3、把區間\([l.r]\)反轉,即())(

4、查詢區間\([l,r]\)至少要修改幾個括號才能全部匹配。

乙個區間的括號去掉匹配後一定長成)))))((((((這個樣子。

所以答案就是未匹配左括號個數/2+未匹配右括號個數/2,除法向上取整。

考慮把左括號看成1,右括號看成-1。這樣左邊的未匹配右括號個數就是最小字首和的絕對值,右邊的就是最大字尾和。

要維護區間翻轉反轉就還得同時維護最大字首和與最小字尾和。

注意這裡最小xx數的上界是\(0\),最大xx數的下界也是\(0\)。

\(splay\)維護即可。

區間覆蓋的優先順序高於翻轉反轉,所以區間覆蓋後要把翻轉反轉的標記都清掉。翻轉反轉的優先順序相同,先翻轉再反轉和先反轉再翻轉是一樣的。

#include#includeusing namespace std;

int gi()

const int n = 1e5+5;

int n,m,val[n],fa[n],ch[2][n],lmi[n],rmi[n],lmx[n],rmx[n],sum[n],sz[n],root;

int tag[n],inv[n],rev[n];

char s[n];

void pushup(int x)

void cover(int x,int v)

void reverse(int x)

void inverse(int x)

void pushdown(int x)

int build(int l,int r,int ff)

bool son(int x)

void rotate(int x)

void splay(int x,int goal)

void kth(int k,int goal)

else k-=sz[ch[0][x]]+1,x=ch[1][x]; }}

int main()

return 0;

}

Bzoj2329 HNOI2011 括號修復

傳送門 答案就是去掉匹配的括號後的左邊右括號個數 2 2取下整和右邊左括號個數 2 2取下整 維護 設 為 1 role presentation style position relative 1 1,為1 role presentation style position relative 1 1...

BZOJ2329 HNOI2011括號修復

bzoj 考慮詢問,如果我們把相互匹配的括號刪除,那麼我們最終會得到形如 的序列。對於這樣乙個序列,我們不妨貪心。將左邊連續的l個右括號,從第乙個到 l 1 2分別改為左括號。對右邊則反之。那麼當l為偶數時,左邊會變得合法。當l為奇數時,會多餘乙個左括號,但由於題目保證了有解,即l r為偶數,這個多...

bzoj2329 HNOI2011 括號修復

time limit 40 sec memory limit 128 mb submit 1232 solved 581 submit status discuss 分析 第一次做覺得這道題好神啊!思維量和 量都驚人!今天早上又花20min碼了一次,覺得這只不過是乙個套路題罷了.這道題實際上是由兩個...