2020寒假集訓Day1 分治 總結

2021-10-02 11:54:25 字數 2101 閱讀 4962

(已經會了東西就略過了)

(下面就是自己新學會的)

1、d維數點的bitset暴力方法(o(d*n^2/w))

每個點開d個bitset,分別排序遞推,然後把答案&起來即可

乙個trick:bitset按編號分塊,多做幾次,可以節省記憶體,例題(傳遞閉包)

(想想我以前只會o(d*n^2))

2、cdq分治解決動態凸殼(包)問題

就每次把左邊的加點操作直接維護出(兩個)凸殼,右邊的詢問就直接二分

二分就比較相鄰兩點的斜率與當前二分的斜率是否相同

可以看出cdq分治可以把動態的問題轉化為靜態的build和query,就不需要支援快速insert的資料結構了(少寫乙個set了)

比如動態2維數點可以轉化為靜態2維數點

3、乙個套路題

把點的座標看成(i,prei)值設為i-prei

就是動態二維數點了,直接cdq分治啊

修改就改i,nxti,newnxti的pre值就可以了

4、乙個多項式的題(口胡,並不會具體實現,再次只記錄一下思路)

已知p陣列和 f (f[0]=1)的遞推式:

我們可以先把1~mid的 f 值算出來

然後用它去更新後面的mid+1~r(這個東西有可加性嗎???有(想象一下兩邊a,b都已經算好了a^2,b^2,現在把2*a*b加入,就變成了(a+b)^2),但是不會寫啊)

然後分治計算mid+1~r

5、線段樹分治求解帶刪除動態01揹包

把每個物品算乙個存在的時間區間,然後按時間線段樹分治

線段樹分治的做法就是覆蓋標記,不下傳,然後中序遍歷線段樹,遇到乙個標記就插入,出棧的時候就回退

這裡的回退就memcpy一下之前的dp狀態就可以了

o(nwlogn)

(本來線段樹分治還有一些其他的應用的,然後dls沒講,我要ts)

6、線段樹分治維護帶加邊、刪邊的動態mst

把每條邊算乙個存在的時間區間

lct支援只加邊的mst,套乙個線段樹分治就可以了

回退(因為lct支援刪除),就直接把原來加的邊刪除

7、二項堆

乙個很有意思的東西,它其實是乙個森林

siz=2^x的二項堆

size=11=8+2+1的二項堆

size=7=4+2+1的二項堆

兩個堆合併起來,就像做二進位制加法(o(logn))

11=1011

7=0111

18=10010

也就是相同size=2^p的二項堆合併(o(1))形成乙個size=2^(p+1)的堆

刪除?把根節點去掉後就是兩個二項堆合併了

8、二進位制分組

竟然和這道題的思路差不多

字尾insert優化的那段就是二進位制分組

上面的那道題實際上就是一邊建樹一邊查詢,一共就建了這樣一顆線段樹

所以均攤是o(n)的

然後我們在更複雜的題目中會在這棵全域性的線段樹上每個點維護一些資料結構

這種資料結構就只需要build和query就可以了

如果是o(n)build,那麼它的均攤複雜度就是o(nlogn)

參考部落格:

(有一些還沒來得及整理的)

9、版本樹(佔坑)

這個東西好像讓二進位制分組支援了刪除操作,但是沒太聽懂

10、cf 102354 b(佔坑)

(下午為什麼畫風突然變成dp了???)

11、ioi2013(佔坑)

12、ioi2014 holiday(佔坑)

13、廣義單調性(佔坑)

寒假集訓系列DAY 1

problem a.string master master.c cpp pas 題目描述 所謂最長公共子串,比如串 a abcde 串 b jcdkl 則它們的最長公共子串為串 cd 即長 度最長的字串,且在兩個串中都作為連續子串出現過。給定兩個長度都為 n 的字串,對於字串大師的你來說,求它們的...

2018寒假福州集訓記Day1

哦 今天上午直接一波考試。之前1個月都在準備期末考試,資訊書都沒翻過,考試前臨時抱佛腳,然而並沒啥卵用。好了不談了,說說題目吧。t1是一道dp題目 我考完試才知道,考試的時候我也有想過可能與遞推有關 題目給的樣例剛好是兩種極端的情況,一種是每行語句下面都加乙個printf再編譯一遍,另一種是一直二分...

2018寒假集訓 Day1 位運算 翻轉遊戲

翻轉遊戲 flip 問題描述 翻轉遊戲是在乙個 4 格 4 格的長方形上進行的,在長方形的 16 個格上每 個格仔都放著乙個雙面的物件。每個物件的兩個面,一面是白色,另一面是黑色,每個物件要麼白色朝上,要麼黑色朝上,每一輪你只能翻 3 至 5 個物件,從而由 黑到白的改變這些物件上面的顏色,反之亦然...