【一些總結】


總結

數據結構:

\(DS\)題不要依賴板子,要自己寫,包括各種圖論樹論數論的題,考場沒有板子給你看。

平衡樹與線段樹

平衡樹/線段樹五問:
1.每個節點需要記錄那些信息
2.需要那些標記
3.下傳標記怎么做
4.區間整體修改怎么搞
5.如何合並區間

注意tag操作的long long

線段樹記得返回值啊。

下標是那個你要維護偏序關系的域

如果有對於一個區間的操作,如果端點數較小,考慮離散完丟線段樹上處理

\(Fhq_treap\)在維護名次樹按\(v\)分裂,維護區間按子樹大小。

啟發式合並。

樹狀數組

樹狀數組注意值域大小

尺取

對於一類\(max - min\)的題目,可以考慮按權值排序后尺取。

CDQ分治

cdq分治注意左子區間,右子區間,本區間的更新順序,考慮是否左子區間對右子區間造成的影響是否會影響右子區間本身的更新,如最優化問題

k個最值的求法,先對每個元素進行最操作,再對堆頂進行次操作丟入堆。

考慮堆實際上一個,排序完后依次插入樹的一個結果。

啟發式合並

對於數據結構的合並,大概是暴力合並每個點?
考慮把小的合並到大的來,進行一個啟發式的合並
這樣復雜度是\(O(n min(x,y)) = O(nlogn)\)

multiset:

multiset刪除未出現的元素會出現問題。

區間詢問問題

把詢問看做二維平面,掃描線做

區間詢問差分

可持久化操作

偏序問題

考慮答案性質,對點維護答案貢獻子區間,然后區間查詢查詢子區間貢獻

重復操作問題

考慮kx + b形式利用矩陣

考慮一堆操作,區間查詢,倍增。

若干函數單點取min

可以使用凸殼維護,不過容易出鍋,建議使用李超樹

樹論:

直徑

樹的直徑的一些性質:兩顆樹由一條邊連在一塊,則新樹的直徑,定為原兩顆樹的直徑的兩個端點取二

就是找一個最遠點,讓\(dis(u,k)\)最長,在樹上的話,我們知道這個點\(k\)是這顆樹上直徑的兩端之一。

一些結論

區間移動,求rk,可以考慮在 \(n + m\) 的序列上操作,用log的數據結構求rk。

樹上距離問題

考慮樹上的關鍵點群的路徑和可以通過用dfn排序,相鄰距離和除2來求

樹上子樹查詢問題

dfn序上操作

啟發式合並

二維平面操作

路徑問題

樹剖

樹上差分

看到樹上路徑,考慮拆成\(u->lca>v\)兩段處理。

LCT

路徑滿足某種性質,則考慮利用性質依次加點例如樹上笛卡爾樹

樹上莫隊

對dfn序操作

在樹上按dep 根號分塊

背包

上下界優化

樹上構造題

考慮葉子是否能夠強制只有一個狀態滿足條件

考慮轉化到dfn序上問題

考慮直接上線段樹合並

考慮度數

樹上dp

啟發式合並優化

ddp(改變權值最大聯通塊)

一些特殊性質

線段樹狀其樹高log

隨機樹期望樹高根號

限制子樹dep,則按dep加點

字符串

子串

考慮數滿足某個條件子串的數量,可以從結尾統計

tire

注意tire樹的空間。

hash

靜態相等問題可以用hash做。(比如判數組相等問題,可以對每個下標隨機一個權值)

思路

兩種對於字符串匹配有包含關系的結構:

AC自動機的fail樹
后綴自動機的后綴link樹
點是邊的多一。

細節

strlen是O(n)

圖論

基礎

在圖上遍歷要寫for(int i = head[u];i;i = e[i].next)

差分約束系統:

在構造時要對構造出來的系統保持清醒認識。
在判負環時可以考慮犧牲一些正確性換取時間

園方樹

圓方樹記得不要退棧到\(u\)

tarjan

割點:

low[v] >= dfn[u] and !(u == 1 && son_size == 1)

強連通分量:

要記得維護在搜索樹上的點,low,dfn只在他們中間更新。
dfn[u] == low[u],出棧到u為一個強連通分量。
即已經確定了聯通分量的不在搜索樹上。

點雙:

low[v] == dfn[u]
退到v,加上u是一個點雙
點雙:在塊內 ab 兩點之間一定存在兩條點不相交的路徑

邊雙

low[u] == dfn[u]
退棧到u
邊雙中能夠滿足以下條件:
對於任意對點對,都可以調整無向邊方向為有向,保證有\(s_i \to t_i\)都成立。
邊雙:在塊內 ab 兩點之間一定存在兩條邊不相交的路徑

最短路

改變中間路徑求最短路,但起終點不變可以以起終點兩邊dij

最值計算可以考慮圖論模型。

最短路樹

等邊權無向圖其最短路樹為BFS樹

二分圖匹配

二分圖有最優匹配的條件:
\(\forall V \in S,|V| < |N(V)|,N(V) = \bigcup_{x \in V,(x,y) \in E(x)}y\)

圖上刪環問題

只要刪搜索樹上返祖邊即可刪完

圖上路徑查詢

重構樹

按性質加點並查集維護連通性

bitset硬來,\(n^2/w\)

動態規划

優化

斜率優化一般不用設初值,但如果有多層dp,建議跑第一層dp初值,單調隊列\(head < end\),只要覺得自己柿子沒推錯,就相信自己。

考慮數據結構優化

考慮更改狀態

狀壓

考慮順序枚舉,實際上可以用狀壓解決從\(n!\)\(2^n\)的復雜度

子集dp

枚舉子集:

for(int S1 = S;S1 != 0;S1 = (S1 - 1) & S)
del(S1);

細節

控制轉移次數的最小可以每次減去一個INF

當答案小時,可以考慮更改狀態,設能否到達,將最值問題轉為可達性問題。

數論:

基礎

\(\sum (n/i) = nlogn\)有點蠢

容斥

考慮容斥,考慮一個和式求解的柿子可以考慮插板法。

矩陣乘法

對於矩陣乘法,多次詢問,單次是倍增做法的,可以考慮記錄一下每個倍增點的矩陣,少個n。

鴿籠原理

考慮到有\(m\)個限制,可以考慮\(m+1\)個最大的答案,這樣可以利用鴿籠原理得到答案。

計數

方案數的次方,可以看做多個單獨操作的合並

正難則反,反面會很好做(在共集問題中)

取模問題

\(a^{x1^{x2^{x3....}}}\pmod{p}\),可以在\(log(p)\)次的暴力用擴展歐拉定理解決。

二項式反演

我們設\(f(i)\)表示欽定\(i\)個,其他不管的方案數,\(g(i)\)表示恰好有\(i\)個的方案數。
那么就有\(f(n) = \sum_{i = n}^m\binom{i}{n}g(i)\)
二項式反演一手則有
\(g(n) = \sum_{i = n}^m (-1) ^ {i - n}\binom{i}{n}f(i)\)

一些結論

最小權覆蓋集 = 全集 - 最大權獨立集

正難則反。

Q:有\(k\)個點要統計所有點對的一種值。
怎么怎么在logc次分組內遍歷所有點對。
A:對二進制下每一位都按0,1分組。([GXOI/GZOI2019]旅行者)

每個元素有0/1狀態,翻轉狀態看成異或。

Dilworth定理:最長反鏈=最小鏈覆蓋=最大獨立集

一個數對\((a,b)\)可以考慮取出\(gcd\),讓他們兩個互質使條件變強

\(kkkkk\)這樣的數可以表達為\(\frac{10^n - 1}{9} * k\)

但是如果我們做大於等於的話,就只用一遍\(dp\)即可。
然后我們做這樣一個過程:
\(\sum (A_i - A_{i - 1}) * g\)(WC2021),前綴和和恰好的關系。

區間問題

考慮\(|a - b|\)轉變成\((a,b)\)區間長度

數個區間求最長交集,考慮按\(l\)排序,維護最大的\(r\),考慮答案為\(max(min(r,r_i) - l_i)\)

細節

快速冪不要溢出負數,直接全開ll

貪心

一些結論

有多個相同對象操作求最值考慮差分並貪心。

二分

考慮比較關系的,可以考慮二分一個中間,把他轉換成01串來操作。

反悔貪心

即每次貪心時給一個反悔路徑

雜項

思路:

碰到類似於\(2^n\)的東西往二進制上靠

遇到類似於一個點對一段區間有貢獻的題目,往樹上想。

字典序最大的一類題目:
正解則是考慮按位確定:考慮從 \(1\)\(n\) 依次確定該點選了哪個值,確定 i 這個位置的值時,我們選取滿足以下條件的值:

  1. 使得這個東西確定之后,存在一種 \(i+1\)\(n\) 的分配方案,使得總方案合法。
  2. 盡可能大。

考慮抽象模型

如果兩個函數一個單調增,一個單調減,如果兩個函數相交是理論最大值。
但是由於兩個函數是離散的,可以考慮這樣一個東西。
那么答案是如下兩個\(k\)的最大值:
\(f_1(max(k)),f_1(k) < f_2(k)\)
\(f_1(min(k)),f_1(k) >= f_2(k)\)
由於函數性質,所以可以進行二分。

看到區間形式,考慮是否能夠進行前綴消除轉化為[1,l - 1],[1,r]的操作,如異或粽子

對於一些無法正面求解的問題或者條件,考慮正難則反。
或者先對一些易滿足的條件進行滿足,在這個基礎上進行調整。

對於\(n^3\)復雜度的東西,矩陣,區間dp考慮一下。

最大前綴和等價於:
前綴的后綴沒有小於0的
后綴的前綴沒有大於0的

解決最優化問題的一類方法:
網絡流,費用流
貪心
動態規划
做一個不滿足題目約束條件下的解,並考慮調整他。

LIS和LDS的長度一定有一個大於等於根號n來着吧。

考慮在序列上多次詢問完成目標要多少次操作,可以倍增思考。

細節:

long long long long long long long long long long long long long long long long long long

注意數據范圍,\(long long\)是否要開,數組是否夠大

快讀時如果保證沒有負數可以不寫判負數的程序,能快不少。

注意哪些地方要\(ll\),哪些地方不用,\(int\)\(ll\)速度差很多,常數差就在這里。

low[u] == std::min(low[u],dfn[v]);這個是不會報錯的(要寫單等號)

不要寫錯東西,思路要清晰,過了樣例並不能說明什么,一定要記得對拍

要敢於寫代碼,不敢做就永遠跨不出那一步,你明明能做的很好。

數組A[N],下標只到N - 1,別被RE送回家

對於某些操作使答案變化的題,如果沒法直接維護,可以思考是否有一些性質的操作能讓答案變得更好。

指針移動完可以考慮再向兩邊擴展一下保證正確率,甚至可以讓假做法過去。在明白有單調性但不是很清楚時可以用。
指針移動要考慮移動的范圍,不要出界。

數據量大就記得快讀,最好養成大於\(1e5\)就快讀的習慣。

取模最好手動實現,因為直接取模真的很慢。

在函數里定義變量記得賦值。不然會出現隨機的數據

眾所周知sqrtt是一個跑得極慢的函數
所以我們可以兩邊平方消掉sqrt,最后再算一次即可

就是如果一個東西有很多操作會貢獻,然后一個東西只貢獻一次, 我們強制他貢獻的時候只在第一個把他貢獻的位置計算。

自信

21-11-17補

區間詢問問題

數據結構

倍增

硬做,可能復雜度是對的

最優類問題

數據結構

抽象模型,考慮其有貢獻需要多少代價

動態規划

網絡流

貪心及反悔貪心

構造方案

二分,轉成可達類問題

拆貢獻形式

可達類問題

並查集

圖論中直接縮點或者\(\frac{n^2}{w}\)

考慮依次加點維護動態問題

線段樹優化值域可達性dp

構造一種可達方案

構造類問題

手動構造

轉換為圖論或者樹論問題

帶權二分(不建議使用

數論問題

轉換為函數問題

重復操作問終態

矩陣乘法

倍增

數據結構直接硬維護

對待一些結論題的做法

先從基礎的結論入手

大膽猜想,手動構造驗證

直接證明

求全局和類問題

樹上換根

考慮快速對每個單點求和

考慮拆貢獻

掃描線,固定一端,求其他全局和

驗證性問題

考慮直接比對

考慮最小循環同構

考慮隨機權值hash比對

考慮優化比對過程(kmp)

計數問題

考慮直接dp優化

考慮數據結構

考慮容斥

考慮補集(在詢問有交集集合個數是有奇效)

高維前綴和可處理子集貢獻問題

數學問題

考了就寄。

考慮數對(x,y)取出gcd,強化條件

考慮一個數的貢獻

考慮清晰寫出表達式,化簡

二元方程同樣可以使用掃描線

考慮很多時候直接搜索由於有上限限制,所以復雜度是對的

積性函數

幾何問題

考了我吃。

其他問題

沒啥好說的
膽大心細,記得對拍
考的都會,不會的都不考。
相信自己的水平吧,來走了一遭,不再后悔。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM