这题狠狠地坑了一爹啊。我优化半天递归非递归,自顶向下,自下向上的splay都写了一遍测试,结果最快的还是递归和自顶向下的。
,还是一直TLE。然后测了一下C++标程。比我的弱PASCAL还慢。
交上bzoj一测。C++AC。我的TLE。。
Q_Qpascal木有O2开关啊
言归正传。。这题看到reverse操作自然而然想到splay。。然后就是如何维护输出值
我们对于一个括号序列
我们可以把左括号当做1.右括号当做-1。遇到一个右括号找到前面的左括号都删去= =
我们可以知道。。最后一定是
))))((((((这种形式的。
那么我们找到没得匹配的右括号最多的。。。
那这个做例子 ((()(()))))))(((((()(
((()(()))))))(((((()(
加粗表示匹配的括号。
那么我们维护一个前缀和 。。找到从左到右最小的和(未匹配的右括号最多)x。从右到左最大的(未匹配左括号最多)y
))) | ((((((
一个括号序列分成一堆右括号和左括号。
那么修改的最小值就是(abs(x)+1)/2 + (y+1)/2
一下的我弱p代码- -懒得改成C去A这题了。= =