2017 10 7 括號序列 思考記錄

2021-08-09 01:30:33 字數 848 閱讀 6389

這個題看起來很簡單,但細節比較麻煩、參考完別人的**後才想出自己的解法的。。

一開始認為已匹配的括號是可以直接消的,所以就只維護了兩個變數

但還有區間取反、、 由於和已配對的括號的順序有關,所以不是很好離散、

其實知道取反的本質和與不取反的區別就好了。。

不取反是()匹配,,取反是)(匹配

不取反記錄左邊的)、右邊的(

取反記錄左邊的(、右邊的)

所以遇到取反操作時,直接兩組變數替換就行了。

然後如果把(看做+1 )看做-1

則未匹配的(、)括號的個數是可以直接通過區max和min確定的

最後輸出時+1  -1←實際是+1  是 為了省略 奇偶匹配時的特判

碼:#include#includeusing namespace std;

int fz[100005],rt,fu[100005],zkh2[100005],ykh2[100005],he[100005],op,a,b,ch[100005][2],khlx[100005],sz[100005],rev[100005],zkh[100005],ykh[100005],i,j,n,m;

char str[100005];

void up(int o)

else if(str[mid]==')') ykh[mid]=-1,zkh[mid]=-1, he[mid]=-1;else khlx[mid]=-1;

return;

} if(l<=mid-1)

if(mid+1<=r)

up(mid); //cout<>1;

jian(1,n+2);

for(i=1;i<=m;i++)

{ // cout<

2017 10 7 彈飛綿羊 思考記錄

這個題根據彈後的關係是很容易想出乙個森林的。修改連線關係就是cut和link。但是分塊的做法似乎十分優越,好寫好調。所以學一下分塊的寫法 首先每乙個區間的資訊都是可以做到o 1 查詢的。就是dfs預處理 但如果有修改,就需要更新dfs,是o n 的 由於每個點只會往後走,所以可以把原森林劃分為從後往...

2017 10 24 上公升序列 思考記錄

終於有會做的題了。一開始想用正常的lis 然後從前往後掃,由於最優查詢區間在序列上是按順序單調遞增的,所以想記錄每個點取哪個值跳到哪,這樣是n m logn的 然後發現既然是單調遞增的那直接掃不就可以了,如果乙個點能往後取到大於等於查詢值的,就直接把他加上 然後相當於詢問每個點能往後最多延伸幾個點,...

2017 9 10 序列操作 思考記錄

唉,怎麼說呢 pushdown要注意的事全忘光了 寫 調竟然花了兩個小時 要注意反轉時是 1而不是 1!下傳標記不要單純管順序,因為沒有任何意義,要確保在任意時刻乙個點只有一種同級標記!比如賦值和反轉就是一級的 順序可以換 但加減和乘除是兩級的,因為可以規定先加減再乘除 就不會影響了 碼 為什麼我寫...