魚的記憶[較爲重要的知識點/技巧]

傳說中魚只有7s的記憶。
而我不足7s的記憶。
真是悲傷TAT
記了什麼東西,一會就忘記了。


我當時初中的時候想去自學高中課程……
但是自己完全沒看懂。
其實不是自己看不懂而是自己“覺得”這個東西沒什麼用。
而且還”難”。
所以就選擇性的忘記了。
我不想我學過的SAM,LCT什麼的都變成選擇性忘記的東西。
真的決定,要麼一個東西完成100%.
要麼就一點都不要碰。


在此總結一些OI上的容易”忘記”的知識點:
以下雖然有標號,但是感覺是不分先後的。

1.單調性

掃左端點右端點單調。
習題:
1.n個正整數,m個區間,選k個使得交區間的和最大。
注意到,按照左端點排好序之後,掃描左端點的時候,右端點是單調不降的。
實際上,右端點是右側數第k個。
那麼開個線段樹隨便做。


2.容斥原理

容斥原理似乎很容易解決一些問題:
1.交集轉並集的補集。
大大走格子:
n*m的格子,有些點(1k)不能走,只能走右下,求方案數。
首先注意到任意走的話,可以寫成組合數的形式。
那麼我們容斥的話就要減掉所有的不合法的方案數。
注意到,如果第一個障礙不相同,那麼其他就不相同了。
而只要踩了一個障礙,那麼怎麼走都不合法。
這樣這個題就能解決了。
2.硬幣購物(放個板子題)
3.HDU5731(插頭DP+容斥)


3.分塊思想

有一些東西,我們可以根號大暴力。
比如說51nod的三個題:
1.求整數n的不同劃分方案數,一個劃分中不能有相同的數字。
對n分類:>sqrt(n)只能選根號個,小於根號的也不會超過500。
f[i][j]表示湊i用了j個數字。
那麼我們會發現實際上是在集合裏填數的過程,即要麼集合整體+1,要麼加入一個新數再整體+1.
隨便算。
2.求整數n的不同劃分方案數,一個劃分中可以有相同的數字。
對>sqrt(n)是可以用第一題的方法解決的,但是小於的話我們好像不太好解決。然而可以揹包。
那麼我們合併一下就完了。(注意大於的時候要設一個單位元)
3.你有n元錢。去買東西的時候,價格爲i的恰有i個。正好花完這n元的方案數是多少?
如果>sqrt(n),那麼我們就是依舊的第二題。
小於的話顯然可以多重揹包,但是會發現T掉了。(廢話)
仔細看看就是個模意義下的前綴和?
解決了。。。
2016-11-21
Codeforces #380 div1.D
雖然注意到根號,但是完全不覺得有用,這就是死因所在。
我們一定要注意到奇特的地方,然後試圖去解決它。


4.黑科技建圖

我記得有個人的博客上寫了這一坨東西,大概是一個可持久化線段樹優化建圖的事情,具體題目在BZOJ的某個題有個”XXXXXXII”這個題面應該很好找。
PA2011 Journey
首先我們發現暴力建圖不可取。
然後如果想一想的話,實際上可以把這個連續的一段點拆成區間。
那麼我們考慮用某個點P去更新答案的時候,只需要看P所在的這段區間是否被之前的子節點更新過了就行,因爲這是bfs的過程。
我們發現每個區間必然只會更新一次,每個點必然也只會被更新一次。
那麼總複雜度是O (跑得過)。


5.前綴和

不會前綴和的人在BJOI都被6題暴力了。
1.BJOI的SBD1T3。
2.n個數,問所有區間中多少個區間平均值>=m。
我們來看這個題。
首先顯然的轉前綴和,這樣變成了s[r] - s[l - 1] >= len * m
不行,還不能做。
實際上,我們關於這個長度的定值,顯然也是可前綴和的!
s[i] = s[i] - i * m;
這樣的話我們就問有多少s[r] - s[l - 1] > 0。
離散化之後,枚舉左端點,右端點在樹狀數組中查詢。


6.離線算法

許多人啊。
他們不知道離線的可貴。
他們不知道只有刪除的題可以離線轉成只插入的題。
嗯沒錯我就是他們中的一員。
1.每次刪除一條邊,詢問聯通塊個數。
離線+並查集。
2.莫隊的題。
3.暴力分塊重構。
4.覆蓋問題(顯然每個點只需要倒着覆蓋一次即可)
……


7.倒着DP

習題1.獎勵關。
習題2.hzwer的模擬賽有一個很好玩的題。


8.數值的定義域

這個是什麼呢……
就是有個顯然的把所有數值都存起來的題,然而我沒想出來。
在做一些明顯有最大值最小的東西,然而還讓你變成最簡分數的題的時候,可以看看它的數值的定義域,是不是可以承受的級別。
爲什麼要墨跡這麼多呢,因爲我記不得題面了。


9.最短路

我SPFA寫拆點的題就沒有一次能想到拆點啊摔


10.要學會解方程

這裏的意思是,解一個方程的過程要寫出來。
比如

ax+by=e
cx+dy=f

你並不知道a,b,c,d 是否是正整數,所以這樣會很麻煩。
乾脆寫個高斯消元?
並不知道這種東西怎麼考慮。

11.用堆維護刪除序列

習題:鏈表+堆維護最大M子段和。


12.雙指針

習題1:n只寵物小精靈一共有m種,你要每種至少抓一隻,只能抓連續一段小精靈,求最小的區間長度。
注意這個轉移指針是O(1)的。
//好像如果能用雙指針轉移往往都是O(1)的啊
//一般來講前綴和+二分可以變成雙指針的形式。


13.常見貪心:

用大的帶小的:乘船問題什麼的。
每次合併兩個小的:合併果子。
balabala


14.暴力DP:

暴力DP的想法雖然大家都懂,就是先列一下樸素的方程,然後再說別的。
但是顯然對於這個題……
真的是想一想暴力就A了啊GG
這裏寫圖片描述
考慮f[i][j][k]表示sum爲k,走到(i,j)。
然後沒了。


15.CDQ分治:

作爲一個能寫動態開點線段樹就懶得寫別的的時候。
被卡空間的時候真是喜聞樂見。
神TM不會CDQ分治啊……
以後能用CDQ就不寫數據結構了!
代碼能力–;
=> 代碼能力 < 0.


16.卡特蘭數

卡特蘭數f(n)是長度爲2n合法括號序列方案數。
其計算公式

(2nn)(2nn+1)=(2nn)n+1

推導過程(ノ*・ω・)ノ
首先肯定是在2m+1 位上第一次出現了右括號(記作0).
對於剩下的(nm) 個1以及(nm1) 個0所能任意組成的序列個數,等價於(nm) 個0以及(nm1) 個1所能任意組成的序列個數.
那麼實際上,對於所有的m,我們都計算一遍。
不過仔細想一想,實際上就是詢問長度爲2n 序列中,有n+1 個0的序列個數。
得證。

17.法裏級數

我們如果要得到以m爲分母的所有的真分數,那麼肯定是:
(1..i) / m
但是肯定有一些東西不是最簡分數。
我們知道,化簡之後肯定是一個p/q 的形式。
那麼我們把它都化簡之後,對於分母q 能得到:p/q(p,q)=1
我們知道,對於所有化簡之後的分母,我們能得到m 個最簡分數。這樣,我們推斷出一條性質:

d|nφ(d)=n

估計這個很好玩,可以出題。

18.暴力建圖的優化

河裏有n個點,每個點上可以放m種盤子,每種盤子有代價。
現在問你在點上放盤子走到對岸的最小代價。
我們顯然能看出這是個最短路題,但是我們暴力拆點建圖的話,點數是O(nm) 的,但是邊數爆炸。
我們可以仔細考慮一下,實際上我們只需要對於點i的對應着第j個盤子向第j+1個盤子連代價差就行了。然後對於每個點,我們自己連自己的價格差就行,這樣邊數就降低到了O(n2m) .



19.刪除一類問題的單調性/永久性

bzoj 3069 可以發現,每個邊雙在刪除最後一條邊的時候,纔會被永久消除。我們倒過來插入,啓發式合併即可。但是由於自己太懶了,寫的LCT。
[PA2011]Journey 考慮到一個點如果被遍歷到了,實際上它就被永久刪除了,那麼我們開個set什麼的記錄一下,或者用鏈表刪掉它即可。


20.掃描線

掃描線和預處理不同,掃描線是你邊加入貢獻邊算答案,你並不知道未來/歷史的值,而預處理就是你知道過程中的所有的值。
我們來看SRM671的Div1600的題目:
給你一個序列s,問滿足a<b<c<dac=bd 的四元組個數。序列長度小於等於1000.
如果我們採取預處理的辦法,是沒辦法得到答案的,因爲我們要記錄每一時刻的答案。那麼不妨倒着枚舉b,然後加入所有的(c,d)元組,再枚舉a來更新答案。

dwn(i,n)
{
    b = w[i];
    rep(j,i - 1)cal(a = w[j],b);
    c = w[i];
    rep(j,i + 1,n)add(c,d = w[j]);
}

似乎四元組的常見思路是想辦法枚舉中間兩個/把前兩個和後兩個獨立開來。
詢問[l,r]的數值個數。
[i,last[val[i]]]看作一個點,然後我們就需要知道橫座標在[l,r],縱座標[0,l-1]的矩形點數。
這個顯然可以1個log解決。
離線:掃描線
在線:可持久化


21.鴿巢原理

CF681A
構造題,題意:構造一個長度爲n的序列,使得這m個區間的mex值的最小值最大。
做法:如果考慮鴿巢原理的話,我們每1..len 就順序放排列,這樣的話顯然的一件事情就是對於長度大於len 的肯定能滿足條件。這就是鴿巢原理的應用。

22.查詢區間的小於一個數值的個數

這個顯然是主席樹/掃描線+樹狀數組。
題目:
一個n個節點的樹,m次詢問,每次詢問一個點u滿足dep[u] + val[u] >= dep[v]的v的個數。
顯然對dfs序建樹然後搞一搞就行了。

23.環<=>二分圖(注意特殊的度數情況)

環=>入度等於出度。
那麼意味着一個匹配。
BZOJ3171
直接建圖跑費用流即可。

24.寫遞推式

無論什麼時候,都不要忘記寫遞推式。
無論你覺得那個遞推式難不難寫。
收智商稅的時候到了:
SRM664D1L1:
兩堆石子。每次從大的裏撈出小的那部分,然後放到小的石子那堆裏。
問k次操作時候會變成啥樣。(int範圍)
交智商稅的時間到了!
叫你不寫遞推!
叫你不寫遞推!
叫你不寫遞推!
叫你不寫遞推!
叫你不寫遞推!
叫你不寫遞推!
f[i] 表示第i 次的最小的那堆的數目。

f[i]=2f[i1]<SUM?(2f[i1]):(2f[i1]SUM)

快速冪解決即可。

25.點分治

點分治是解決樹上路徑問題的比較常用的做法。
我們解決點分治的時候,如果處理要過x的路徑,那麼通常會面臨算到了x的某個子樹裏面去這種問題。所以我們通用的一種做法是先計算答案,然後再Update一下這個子樹的貢獻。
還有一種想法是容斥,比如點分治的板子題,我們就用了容斥的思想,先什麼都不管暴力算一算,不管在不在子樹裏面,然後直接把子樹的這種暴力的答案減掉就行了。

26.樹思想

之前自己只知道一棵叫做dfs/bfs樹的東西。
現在知道了很多恐怖的東西。
比如點分樹(solve(x)調用的時候形成的樹),fail樹(AC自動機的那個fail指針的樹)。
很多東西需要自己發現,而不是別人說:”告訴你,點分治形成了個樹”的時候,你才知道點分治會搞出個樹。

27.線段樹分治

我不得不說似乎這個東西挺妙的。
把插入刪除變成只有插入和撤銷兩種操作,還是挺好玩的。
另外還學到了並查集的啓發式合併,感覺非常開心。


28.歐拉定理

b>φ(p) 的前提下:

abmodpabmodφ(p)+φ(p)modp

29.平方與卷積

(ab)2=(ba)2 .
那如果在前面乘上一個f(a) ,就成卷積形式了,就可以FFT了!

30.斜率優化

其實是個很簡單的東西,把ij 分離,把只和j 有關的看作Yj ,然後把i,j 都有的那個j 那項看作橫座標,用i 那項去碰凸殼就行了。

31.極差的性質:

一段區間的子區間極差最大值:
顯然等於這段區間的極差。
因爲增長區間之後,最大值不降最小值不增,故極差不降。
一段區間的子區間極差最小值:
顯然等於每個相鄰兩個數的差值,理由是極差不降。
來自北京冬令營的T3。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章