HNOI2011 括號修復 Splay

2022-05-07 08:21:06 字數 1387 閱讀 7566

題面

bzoj2329

解析要支援區間翻轉,就可以想到splay了

但是要維護什麼資訊才能得到答案呢,將 「)」 看作1,」(「 看作-1,記字首最大和為$lx$, 字尾最小和為$rn$,那麼$ans = \left \lceil \frac \right \rceil + \left \lceil \left | \frac \right | \right \rceil$, 因此維護字首最大和$lx$, 字尾最小和$rn$,但由於有區間翻轉與取反操作,還需要維護字首最小和$ln$, 字尾最大和$rx$,更新的方式與splay求最大子段和時一樣,如圖:

可以求出答案了,但還有一件事需要考慮,就是標記與標記之間的影響,也就是標記下放時的先後順序。顯然覆蓋標記需要先下放,它需要把兒子的翻轉與取反標記清0;接下來是先翻轉還是先取反呢?實際上兩個標記之間沒有影響,無論哪個第二個下放都行,我按照題目順序,把翻轉標記第二個下放,取反標記最後下放

**:

#include#include

#include

#include

using

namespace

std;

const

int maxn = 100006, inf =int_max;

template

void read(t &re)

intn, m, root;

inta[maxn];

char

ch[maxn];

struct

splay_treetr[maxn];

void cover(int now, int

x)void reverse(int

now)

void oppsit(int

now)

void spread(int

x)

if(tr[x].rev)

if(tr[x].opp)

}void update(int

x)void rotate(int

x)void splay(int x, int

to)

if(!to)

root =x;

}void build(int l, int r, int

ff)int find(intx)}

intmain()

else

if(opt[0] == 's'

)

else

if(opt[0] == 'i'

)

else

}return0;

}

view code

HNOI2011 括號修復

設 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 ...

HNOI2011 括號修復

乙個合法的括號序列是這樣定義的 空串是合法的。如果字串 s 是合法的,則 s 也是合法的。如果字串 a 和 b 是合法的,則 ab 也是合法的。現在給你乙個長度為 n 的由 和 組成的字串,位置標號從 1 到 n。對這個字串有下列四種操作 replace a b c 將 a,b 之間的所有括號改成 ...

HNOI2011 數學作業

hnoi2011 數學作業 小 c 數學成績優異,於是老師給小 c 留了一道非常難的數學作業題 給定正整數 n 和 m 要求計算concatenate 1.n mod m 的值,其中 concatenate 1.n 是將所有正整數 1,2,n順序連線起來得到的數。例如,n 13,concatenat...