time limit: 40 sec memory limit: 128 mb
submit: 1232 solved: 581
[submit][status][discuss]
分析:第一次做覺得這道題好神啊!思維量和**量都驚人!今天早上又花20min碼了一次,覺得這只不過是乙個套路題罷了.
這道題實際上是由兩個子問題組合而成,首先要知道怎麼求將乙個括號序列變成合法的括號序列需要的操作次數,還要知道怎麼維護.第二問比較容易看出來,因為涉及到區間翻轉操作嘛,那就用splay維護.第一問是乙個經典問題,如果將匹配的()括號拿走,剩下的括號就變成了形如:))))))((((((((.答案就是左邊括號的數量 / 2上取整 + 右邊括號的數量 / 2上取整.
那麼怎麼把這兩個東西結合在一起呢?也就是說,怎麼維護左邊的))))括號數量和右邊的(((((括號數量呢?我一開始的想法是維護()的數量,用總的(,)數量-()的數量.實際上會有((()))這種巢狀的括號,比較難以維護.
於是套路來了.將(看作-1,)看作1,求一下左邊最小連續和與右邊最大連續和就是)(括號的數量了.答案向上面說的那樣統計就好了.
關鍵是有3個操作,每個操作都會打上標記,標記有點不好處理.處理標記要看標記與標記之間的影響,標記下放的順序以及標記對區間資訊的影響.
如果有replace標記,那麼肯定是它先下放,然後replace標記就會清空,它會清空掉swap和invert標記,並改變當前區間的sum和值v.
swap標記對其他標記沒影響,只是讓lmax,rmax;lmin,rmin交換一下,並且交換左右子樹.
invert標記是將lmax,rmax,lmin,rmin分別取反後,lmax與lmin交換,rmax與rmin交換.同時讓v和sum取反.對其它標記沒有影響.
注意點:splay和線段樹不同,splay上的每個節點不只代表乙個區間,還會代表乙個值.在pushup和下放標記的時候要考慮對這個值的影響.
#include #include#include
#include
#include
using
namespace
std;
const
int maxn = 200010
;int
n,m,root,tot,rev[maxn],w[maxn],inverttag[maxn],replacetag[maxn],swaptag[maxn];
char
s[maxn];
struct
node
e[maxn];
void swap(int
x)void replace(int x,int
d)void invert(int
x)void pushdown(int
x)
if (inverttag[x] != 0
)
if (swaptag[x] != 0
)
}void pushup(int
x)void build(int l,int r,int &x,int
y) build(l,mid - 1
,e[x].left,x);
build(mid + 1
,r,e[x].right,x);
pushup(x);
}void turnr(int
x) e[x].right =y;
e[y].fa =x;
pushup(y);
pushup(x);
}void turnl(int
x) e[x].left =y;
e[y].fa =x;
pushup(y);
pushup(x);
}void splay(int x,int
yy)
else
else
else
else}}
}}
if (yy == 0
) root =x;
pushup(x);
}int find(int k,int
x)void replace(int x,int y,int
d)void swap(int x,int
y)void invert(int x,int
y)int query(int x,int
y)int
main()
build(
0,n + 1,root,0
);
while (m--)
if (ch[0] == 'q'
) printf(
"%d\n
",query(x,y));
if (ch[0] == 's'
) swap(x,y);
if (ch[0] == 'i'
) invert(x,y);
}return0;
}
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 括號修復
bzoj luogu 你需要維護乙個括號序列,支援如下四種操作 1 把區間 l,r 全部改成 或是 2 把區間 l,r 翻轉。3 把區間 l.r 反轉,即 變 變 4 查詢區間 l,r 至少要修改幾個括號才能全部匹配。乙個區間的括號去掉匹配後一定長成 這個樣子。所以答案就是未匹配左括號個數 2 未匹...