題面
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#includeview code#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;
}
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...