1.關於hash
剛開始學hash是為了比較字符串,后來用hash_table來存儲大量元素、快速查找。最近想到的一個用法是,如果我們能給每個不同的元素對應一個的$p^i$的話,可以將一個集合轉化為一個哈希值,從而快速比較兩個集合是否相等。
隊友C:hash是不可撤銷的!
然而真的是這樣嗎?這個問題取決於我們決定$i$的方式。
在字符串比較中,我們同時需要位置和內容信息,有了每個前綴的hash值,我們顯然知道前面的每個位置對應的$i$,可以通過調整獲得任意區間的hash值。雖然區間數($n^2$)復雜度往往是無法接受的,但是在需要考察的區間長度為定值時這個算法還是很優秀的。
再看上面關於集合比較的問題,需要的信息只有內容,hash相當於一個模糊化的存儲,只保留了集體信息而丟棄了單獨元素的信息。雖然這種處理不支持查詢某個元素是否在集合中,但是如果已知一個元素在集合中,我又知道它加入時對應的$i$,刪除操作就是可行的。
所以我們再考慮hash是否可撤銷,就是看能否找到正確的$i$,以及能否准確、不過度地進行刪除。
我們一般印象中的hash往往有大素數、unsigned long long一類的特征。但是hash本質上就是一種“模糊化”的思想,把無法承受的存儲、比對壓縮到只剩下某些關鍵信息。其實求和、取max等等操作都可以是看作廣義的hash,用一個結果來代表這個集合中我關注的特質。反向推想,一些難以處理的比較問題也可以嘗試用hash解決,如兩個集合是否相同。甚至抽取的特征也不一定涵蓋了所有我需要的信息,余下就是在正確率和效率之間尋找平衡,神經網絡等處理大規模數據的算法都有這種思想的體現。hash的正確概率,一是要看不同集合是否對應了不同的hash結果,二是要看這個結果是否能充分反映我關注的信息。
eg:有n個點和m條無向邊,邊的長度均為1。問按順序加邊,加到多少條時開始存在從a到b的長度為5的點不重復路徑,其中a和b是兩個給定點。n、m<=1e5。
2.博弈論哲學
某些srs看起來一本正經胡說八道,實際上只會把博弈論推給隊友,這是毋庸置疑的。
反證法:假設這個狀態必敗,必然先手可以選擇另一操作來把此處的選擇留給后手,與必敗矛盾。可能只存在於較大規模或具備一些基本特征的局面下,如至少有兩個兒子的樹節點等。小范圍仍需手玩。
分離法:通過簡單操作把原局面分為無關的幾部分,或者刪除原局面的一部分,總之把游戲規模變小。
Excel法:當隊友C開始用Excel枚舉每種局面的結果,他很快就會AC了。Excel確實是手動打表的好幫手,效率遠勝紙質計算。
3.笛卡爾模型化
隊友C:現在我們就得到一個經典的二維數點/三維偏序問題。
把問題轉化為一個數點問題、區間問題常常讓事情變得簡單。一對必須同時選取的數可以看作區間的左右端點、兩種權值要求可以看作平面上的兩維、元素的標號是數軸上的一維,如此種種。題目的要求本身沒有改變,我們的思維卻慣於快速應對這種形式。代碼也可以有序地分成轉化、處理兩部分,甚至作證明、檢查時可以完全分開考慮。
笛卡爾坐標系中的模型總是更容易和數據結構建立聯系。我們對數據結構的認識也不應該僅僅從維護信息、算法復雜度角度,還要考慮它有怎樣的降維效果,它本身的特質適合怎樣把我需要的答案分離、統計。處理信息的順序,也即時間維度,也可以作為解決問題的輔助,有自然降維的功能。
eg:n 個人,選白色、黑色各有一個權值,要使所有人選擇后權值極差最小,並且有一些兩個人不能選同色的限制。n<=1e5。
4.數據范圍騙局
“操作數不超過m,m<=1e18”——但實際上按照題目規則,超過2n的操作都是沒有意義的。
“k是兩整點之間距離的平方,k<=1e7”——可以拆成兩數平方之和的數字在這個區間里並不多,可以預處理出所有組合方案,從而把兩個維度分開,實現快速統計和查找。
“強制在線,每次輸入數據需要^opt”——若opt只能為0/1/2之類的小數字,^的結果十分有限,甚至可以根據最后答案倒推。
題目中看似很大的輸入數據,可能由於必須滿足某些規則而變得十分有限。讓出題人造數據時感到麻煩的限制,或許恰恰是選手的可乘之機。從出題人的角度考慮輸入數據可能性,說不定能幫助發現題目性質。
本文送給沒有出現但是獨自承擔了絕大部分數學題的隊友Y,以及另一位我十分希望但不能成為我的隊友的同學。
