傳說中魚只有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的過程。
我們發現每個區間必然只會更新一次,每個點必然也只會被更新一次。
那麼總複雜度是
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.要學會解方程
這裏的意思是,解一個方程的過程要寫出來。
比如
你並不知道
乾脆寫個高斯消元?
並不知道這種東西怎麼考慮。
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合法括號序列方案數。
其計算公式
推導過程(ノ*・ω・)ノ
首先肯定是在
對於剩下的
那麼實際上,對於所有的m,我們都計算一遍。
不過仔細想一想,實際上就是詢問長度爲
得證。
17.法裏級數
我們如果要得到以m爲分母的所有的真分數,那麼肯定是:
(1..i) / m
但是肯定有一些東西不是最簡分數。
我們知道,化簡之後肯定是一個
那麼我們把它都化簡之後,對於分母
我們知道,對於所有化簡之後的分母,我們能得到
估計這個很好玩,可以出題。
18.暴力建圖的優化
河裏有n個點,每個點上可以放m種盤子,每種盤子有代價。
現在問你在點上放盤子走到對岸的最小代價。
我們顯然能看出這是個最短路題,但是我們暴力拆點建圖的話,點數是
我們可以仔細考慮一下,實際上我們只需要對於點i的對應着第j個盤子向第j+1個盤子連代價差就行了。然後對於每個點,我們自己連自己的價格差就行,這樣邊數就降低到了
19.刪除一類問題的單調性/永久性
bzoj 3069 可以發現,每個邊雙在刪除最後一條邊的時候,纔會被永久消除。我們倒過來插入,啓發式合併即可。但是由於自己太懶了,寫的LCT。
[PA2011]Journey 考慮到一個點如果被遍歷到了,實際上它就被永久刪除了,那麼我們開個set什麼的記錄一下,或者用鏈表刪掉它即可。
20.掃描線
掃描線和預處理不同,掃描線是你邊加入貢獻邊算答案,你並不知道未來/歷史的值,而預處理就是你知道過程中的所有的值。
我們來看SRM671的Div1600的題目:
給你一個序列s,問滿足
如果我們採取預處理的辦法,是沒辦法得到答案的,因爲我們要記錄每一時刻的答案。那麼不妨倒着枚舉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值的最小值最大。
做法:如果考慮鴿巢原理的話,我們每
22.查詢區間的小於一個數值的個數
這個顯然是主席樹/掃描線+樹狀數組。
題目:
一個n個節點的樹,m次詢問,每次詢問一個點u滿足dep[u] + val[u] >= dep[v]的v的個數。
顯然對dfs序建樹然後搞一搞就行了。
23.環<=>二分圖(注意特殊的度數情況)
環=>入度等於出度。
那麼意味着一個匹配。
BZOJ3171
直接建圖跑費用流即可。
24.寫遞推式
無論什麼時候,都不要忘記寫遞推式。
無論你覺得那個遞推式難不難寫。
收智商稅的時候到了:
SRM664D1L1:
兩堆石子。每次從大的裏撈出小的那部分,然後放到小的石子那堆裏。
問k次操作時候會變成啥樣。(int範圍)
交智商稅的時間到了!
叫你不寫遞推!
叫你不寫遞推!
叫你不寫遞推!
叫你不寫遞推!
叫你不寫遞推!
叫你不寫遞推!
令
快速冪解決即可。
25.點分治
點分治是解決樹上路徑問題的比較常用的做法。
我們解決點分治的時候,如果處理要過x的路徑,那麼通常會面臨算到了x的某個子樹裏面去這種問題。所以我們通用的一種做法是先計算答案,然後再Update一下這個子樹的貢獻。
還有一種想法是容斥,比如點分治的板子題,我們就用了容斥的思想,先什麼都不管暴力算一算,不管在不在子樹裏面,然後直接把子樹的這種暴力的答案減掉就行了。
26.樹思想
之前自己只知道一棵叫做dfs/bfs樹的東西。
現在知道了很多恐怖的東西。
比如點分樹(solve(x)調用的時候形成的樹),fail樹(AC自動機的那個fail指針的樹)。
很多東西需要自己發現,而不是別人說:”告訴你,點分治形成了個樹”的時候,你才知道點分治會搞出個樹。
27.線段樹分治
我不得不說似乎這個東西挺妙的。
把插入刪除變成只有插入和撤銷兩種操作,還是挺好玩的。
另外還學到了並查集的啓發式合併,感覺非常開心。
28.歐拉定理
在
29.平方與卷積
那如果在前面乘上一個
30.斜率優化
其實是個很簡單的東西,把
31.極差的性質:
一段區間的子區間極差最大值:
顯然等於這段區間的極差。
因爲增長區間之後,最大值不降最小值不增,故極差不降。
一段區間的子區間極差最小值:
顯然等於每個相鄰兩個數的差值,理由是極差不降。
來自北京冬令營的T3。