我不曾上過大學,但這不影響我對離散數學、複雜性分析等領域的興趣;尤其是括號序列理論,一度令我沉浸其中,無法自拔。至於oi演算法競賽,我年輕時確有參加,雖僅獲一枚銅牌,但我素性淡泊,毫不在意,畢竟那所謂fft、仙人掌之類,只是些雕蟲小技罷了,登不上大雅之堂的;只有括號序列才會真正激發我的研究熱情。
我曾天真地以為,憑藉我的學識與才能,足可以在這世間安身立命;然而直到淪落街頭後,我終才領悟現實的殘酷。迫於生計,我只得轉向道德與哲學的研究;但我與括號序列之間情愫依舊,難以剪斷。
理性的傳播總是不順的,研究的道路也是曲折的,但輕易放棄決不是我的風格;為了繼續實現自己的理想,現在我向大家提出一道括號序列的超級大難題。
有乙個由
n n
個左括號 「(」 和
n n
個右括號 「)」 組成的序列。每次操作時可以選定兩個數 l,
r l,r
,然後把第
l l
到第 r r
個括號的順序翻轉(括號的朝向保持不變)。例如將 「()((()(」 翻轉第
3 3
到第 7 7
個括號後的結果為 「()()(((」。
我希望使用不超過
n n
次操作,將這個序列變為乙個合法的括號序列。
眾所周知,合法括號序列的定義如下:
() 是合法括號序列;
如果 a 是合法括號序列,則 (a) 是合法括號序列;
如果 a,b 是合法括號序列,則 ab 是合法括號序列。
自從來到 uoj 這個寶地,我的視野變得開闊了,也見識了更多富有人類智慧型的人士。我相信各位一定能給我更加滿意的答案!
一行乙個長度為 2n
2n的非空字串表示初始序列。保證字串只包含左括號和右括號,且左右括號的個數均為
n n
。對於給出的字串,輸出調整成合法的括號序列的方案。如果不存在這樣的方案輸出一行乙個整數 −1
−1。否則,第一行乙個整數
m m
表示要進行
m m
次翻轉操作。
接下來
m m
行每行兩個整數 l,
r l,r
表示要翻轉區間 [l
,r] [l,r]
內的括號順序。翻轉操作會按你輸出的順序執行。
請保證 m≤
n m≤n
以及 1≤
l≤r≤
2n1≤l≤r≤2n
,否則會被判
0 0
分。如果有多組方案,輸出任意一組即可。
input
)))()(((output
2explanation1 65 8
第一次操作後序列變為 「()()))((」。
第二次操作後序列變為 「()()(())」。
測試點編號
n n
的規模1n≤
4 n≤42n
≤100
n≤10034
56n≤
100000
n≤10000078
910時間限制:1s
1s空間限制:
256mb
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
貪心~
splay也能做……就是不知
麻煩到**去了……
設'('==-1,')'==1,那麼當now==0時,之前的括號都可以匹配。當now==1時,表示當前)比(多,一定要修改。所以我們線性掃一遍,記錄now值,如果now==1,就從這裡開始修改,直到修改到now==0的位置,記錄一下然後掃完輸出就可以了~
因為題目保證左右括號各n個,所以不存在無解的情況。
(我的程式是uoj第二快~紀念一下~)
注意輸入的字串長度是2n的,小心re!
#include#includeint n,now,ans[100001][3],tot;
char ch[200001];
int main()
} printf("%d\n",tot);
for(int i=1;i<=tot;i++) printf("%d %d\n",ans[i][1],ans[i][2]);
return 0;
}
BZOJ4350 括號序列再戰豬豬俠
括號序列與豬豬俠又大戰了起來。眾所周知,括號序列是乙個只有 和 組成的序列,我們稱乙個括號 序列s合法,當且僅當 1.是乙個合法的括號序列。2.若a是合法的括號序列,則 a 是合法的括號序列。3.若a,b是合法的括號序列,則ab是合法的括號序列。我們考慮match i 表示從左往右數第i個左括號所對...
bzoj4350 括號序列再戰豬豬俠
括號序列與豬豬俠又大戰了起來。眾所周知,括號序列是乙個只有 和 組成的序列,我們稱乙個括號 序列s合法,當且僅當 1.是乙個合法的括號序列。2.若a是合法的括號序列,則 a 是合法的括號序列。3.若a,b是合法的括號序列,則ab是合法的括號序列。我們考慮match i 表示從左往右數第i個左括號所對...
bzoj4350 括號序列再戰豬豬俠 區間DP
括號序列與豬豬俠又大戰了起來。眾所周知,括號序列是乙個只有 和 組成的序列,我們稱乙個括號 序列s合法,當且僅當 1.是乙個合法的括號序列。2.若a是合法的括號序列,則 a 是合法的括號序列。3.若a,b是合法的括號序列,則ab是合法的括號序列。我們考慮match i 表示從左往右數第i個左括號所對...