題意:有一套對01串的前綴編碼系統。給出 $k (\leq 52) $ 個編碼規則,每一個長度不超過 \(52\)。顯然,這些01串是不可能有前綴包含關係的。再給出一個長度爲 $N (\leq 52 \times 10^6) $的字符串 \(S\)。如今要把 \(S\) 分解成儘可能多的段,使得每段都不能被解碼。
題解:首先咱們考慮,單個的 \(0\) 和單個的 \(1\) 是否出如今編碼規則裏。顯然只有可能存在某個纔有意義(不然是答案是 \(N\) 或者 \(-1\))。不妨設存在 \(0\) 且不存在 \(1\)。
由於是prefix-free編碼系統,有一個很顯然的性質是:串 \(w\) 是否能被解碼,等價於 \(0^k w\)可否被解碼(以前放 \(k\) 個 \(0\))。
對於串 \(S\),假設咱們固定了一段不能解碼的後綴,考慮前面一段應該怎麼劃分。首先,因爲\(0\) 能被解碼,以前劃分的每一段至少包含一個 \(1\),即最大劃分數是 \(1\) 的個數。此外,咱們也能構造出這個方案:對於每個\(1\),把它和以前連續的 \(0\) 並在一塊兒,獨立成一段。
因此如今問題就是,找到最短的一段不能解碼的後綴,而後答案再加上以前 \(1\) 的個數。爲了快速找合法後綴,咱們能夠對編碼倒着創建trie圖,並拿 \(S\) 在圖裏跑一跑。一旦到了一個不是任何編碼結束點的點便可中止。git
題意:給出一棵 \(N (3 \times 10^5)\) 個點的樹。初始每個點是白的。有 \(M\) 次操做,每次把一個點的顏色取反。每次操做後,問全部黑點構成的生成子樹中的邊權和。
題解:考慮轉化。一條邊在生成子樹中,當且僅當它的兩側都有黑點。對於每條邊,暴力維護它兩側的黑點數量,記爲pair \((a,b)\)。
當一個點顏色發生變化時,它到根路徑上的邊的某一維會變化\(1\),其他邊會在另外一維變化 \(1\)。利用樹鏈剖分,咱們很容易把它們劃成 \(log\) 段來維護。
如今考慮這麼一個問題:要維護一些pair,每次把一段區間的某一維集體變化\(1\)(保證都是非負整數),或者全局詢問全部兩維都不爲 \(0\) 的元素的權值和。直接維護很難,容斥一下,只要會統計某一維剛好等於 \(0\) 的權值和就行了。直接用線段樹維護區間最小值以及它的個數便可。這樣問題就解決可。
其實黑點會構成一棵相似虛樹的東西,咱們能夠直接按 \(dfs\) 序來維護權值和。用經典的 set 操做來支持加和刪。注意這題有點特殊,加入 \(dfs\) 序最小和最大的點時,貢獻計算須要特判。小程序
題意:給出一個長度爲 \(N (\leq 10^6)\) 數組 \(d_i\),表示一棵樹的每一個點的度數。\(d_i=-1\) 表示這個點的度數沒有要求。在全部符合要求的樹中等機率選擇一種。定義一條邊 \((u,v)\) 的代價是 \(size_u \times u+size_v \times v\),一棵樹的代價是邊的代價之和。求指望的總代價。
題解:推一下式子,其實咱們只需求 \(\sum \limits_i (d_i-1) \cdot i\) 的指望。
方案是在全部合法形態的樹裏隨機的,很天然地想到prufer序列。而 \((d_i -1) \cdot i\) 正好是prufer序列裏的元素和。咱們還有 \(-1\) 這幾種標號沒有填過,要填的個數也是肯定的,那麼指望和顯然是取個平均值便可。數組
題意:給出正整數 \(a\),求函數 \(y=(x-a)^2\) 和 \(x=(y-a)^2\) 圍成的區域的面積。
題解:暴力積分後,答案是 \(4a-\frac{1}{3}\)。網絡
題意:給出一個長度爲 \(N(\leq 8 \times 10^3)\) 的 \(01\) 串。對於每個 \(k \in [1,N]\) 都要詢問:全部長度爲 \(k\) 的子序列,兩兩的海明距離之和。對\(40961\)取模,時限\(25\)s。
題解:轉換求和思路,先枚舉詢問 \(k\),再枚舉咱們關注的位置 \(pos\),如今咱們要快速知道:原序列中有多少左邊長 \(pos-1\),右邊長 \(k-pos\),且中間是\(0/1\) 的方案數,把它們乘一下加到答案裏。這個東西沒法快速算,那就嘗試先全都預處理好。
能夠用分治來解決這個問題。設 \(f_{l,r,x,y}\) 表示只考慮 \((l,r)\) 這一段,左邊選了任意 \(x\) 個,右邊選了任意 \(y\) 個,且中間是 \(1\) 的方案數。轉移比較顯然,好比先枚舉 \(1\) 落在了 \((l,mid)\) 這個區間,因此就有 \(f_{l,r,x,y+z} \leftarrow f_{l,mid,x,y} \times C_{r-mid}^z\);另外一側也同理。這是一個很顯然的卷積式子,能夠用 \(NTT\) 加速。這樣,一次分治的複雜度是 \(O(len^2 \log len)\)的。稍微推理一下可發現,全部區間加起來複雜度等效於 \(O(N^2 \log N)\)。app
題意:有 \(N (\leq 60)\) 種物品,每種大小是 \(a_i\),且正好有兩個。求拼出重量 \(W(4 \times 10^{18})\) 的方案數。其中 \(2 a_i \leq a_{i+1} \leq 10^{18}\)。
題解:狀態數不會不少(證實留坑)。暴力 \(DP\) 便可。dom
題意:給出 \(N (\leq 10^5)\) 個在模域 \(p (\leq 10^9)\)下的正整數,\(p\) 是一個質數。有 \(Q (\leq 10^5)\)個操做,每次給出 \((l,r,x) (x \geq 1)\),執行 \([l,r]\) 區間乘 \(x\);或者詢問區間 \((l,r)\) 這些元素在模域 \(p\) 下的乘法的階。
題解:先求出 \(p\) 的原根,把全部元素替換成原根的冪次,這樣詢問就變成了在模域 \(p-1\) 下的加法的階了。
稍微推理一下,得詢問的答案爲 \(gcd(a_l,a_{l+1},\dots,a_r,p-1)\)。直接用線段樹維護區間加區間gcd便可(要用到差分)。
這裏咱們要對 \(N+Q\) 個數求原根的冪次,這是複雜度瓶頸。BSGS的時候不要對 \(\sqrt P\) 分塊,而要設 \(m=\sqrt {P \times (N+Q)}\)。若是使用hash(並且本題有點卡常,必定得用hash),複雜度就是 \(O(m)\) 的。函數
題意:給出 \(N (N \leq 10^5)\) 個數 \(y_i\),分別表示某多項式在 \(x=i\) 時的點值。你要讓這個多項式的度數儘量小。如今問它在 \(x=N+1...N+M (M \leq 8 \times 10^5)\) 處的點值。
題解:本質是一個插值模型。若是採用拉格朗日插值,前綴積後綴積優化後,也只能 \(O(N)\) 求一次單點的值,太慢了。因此用牛頓插值,考慮差分。
作法①:對於 \(1\) ~ \(N\) 這 \(N\) 個數,咱們暴力差分 \(N-1\) 次,最後獲得一個數 \(d\)。那麼顯然,若是加上了 \(N+1 \dots N+M\) 這些數一塊兒差分,到這一層也會所有變成 \(d\)。咱們在後面添上\(M\)個 \(d\),再逆差分回去,就獲得了答案數組。這個模擬是 \(O(NM)\) 的。
考慮加速這個過程。設一個多項式爲 \(y_i \cdot x^i\)。注意到,每差分一次,就是把原多項式乘上一個 \((1-x)\) !由於 \((1-x)^{N-1}\)也能夠快速計算得出,因此用一次 \(FFT\) 乘法,咱們就能算出差分後的新多項式。它必然是從 \(x^N\) 開始有值,而後咱們把大於 \(n\) 次的係數都抹掉,再把 \(N+1~N+M\) 這些冪次前面的係數改爲 \(x^N\) 前的係數。那麼怎麼逆差分回去呢?那顯然就是每次除 \((1-x)\) 呀。固然咱們也能證實這件事,模擬差分過程,逆回去本質上是係數前綴和。而 \(\frac{1}{1-x}\)展開其實就是 \(1+x+x^2 \dots\)。那麼咱們只需把 \((1-x)^{N-1}\) 多項式求逆,乘上它便可獲得答案係數。
作法②(標解):假設點值是 \(a_0\) ~ \(a_{n-1}\)。構造 \(n\)次多項式 \(f(x)=\sum \limits_{i=0}^{n-1} c_i \cdot x^{\lfloor i \rfloor}\)。顯然咱們能夠經過暴力的方法,逐位肯定 \(c_i\) 的值,由於有 \(c_k \cdot k!=a_k-\sum \limits_{i=0}^{k-1} c_i \cdot x^{\lfloor i \rfloor}\)。注意到降低冪能夠化成兩個階乘想出,該式子是FFT形式。因此咱們能夠分治FFT,每次求完左邊的 \(c_i\) 的時候,求出它們集體對右區間的貢獻。這樣咱們能夠在 \(O(N \log^2 N)\) 時間內求出 \(c_i\)。由於求後面的點值時多項式不變,咱們能夠相似地作一遍FFT,算出 \(c_0\) ~ \(c_{n-1}\) 對 \(c_{n}\) ~ \(c_{n+m-1}\) 的貢獻。求出了後者後便可還原回 \(a_i\)。這一步是一個 log。
作法③:威威有更快的作法,懶得寫了。工具
題意:有 \(N (\leq 10^{18})\)我的,每一個人能夠投 \(A\) 或投 \(B\) 或棄權。問 \(A\) 票數多於 \(B\) 的機率。模質數 \(P (\leq 10^6)\)。
題解:轉化爲算平局的機率。很顯然的作法是,求 \(\sum \limits_i C_{N,i} \times C_{N-i,i}\)。但這個不太可作。
從生成函數角度考慮。即咱們要求 \((x^{-1}+x^0+x^1)^n\) 在 \(x^0\) 前面的係數。設 \(n=k \cdot P + r\),因此原式化爲:
$ (x^{-1}+x^0+x^1)^r \times ((x^{-1}+x^0+x^1)^P)^k$
由 freshman's rule,\((x+y)^P=x^P+y^P\)(高維也成立),因此轉化爲求 $ (x^{-1}+x^0+x^1)^r \times (x^{-P}+x^0+x^P)^k$ 在 \(x^0\)前面的係數。由於後者的冪次必然是 \(P\) 的倍數,前者也必須是。由於 \(r<P\),前者惟一的多是取 \(x^0\) (才能最終拼出 \(x^0\))。並且由於 \(P\) 很小,前者 \(x^0\) 前的係數咱們能夠經過上述暴力求出。後者把內層的指數 \(P\) 改爲 \(1\),和原問題等價,繼續遞歸拆外層的指數 \(k\) 便可。優化
題意:給出一張 \(N (\leq 10^5)\) 個點,\(M (\leq N+50)\) 條邊的連通無向圖,求其鄰接矩陣的行列式。
題解:有兩個基本結論:刪掉度數爲 \(1\) 的點,行列式值不變;一條鏈刪到只剩下 \(4\) 個點,行列式值不變。按照這樣的方法重構這張圖,獲得不會超過 \(500\) 個點的新圖,直接跑高斯消元便可。編碼
題意:交互題。有我的藏在\((0,0)\)~\((n,n)(n \leq 10000)\)正方形裏的某個整點裏。每次能夠給出一個圓\((x,y,r)(\leq 10^9)\),會告訴你它在圓內仍是圓外。最多問 \(50\) 次,要求找出這我的座標。
題解:圓心在無限大出時,圓的邊界能夠看作是直線,則詢問變成了半平面。分別對 \(x\)軸和\(y\)軸 二分便可。
題意:給出兩個長度爲 \(N(\leq 10^5)\) 的 \(01\) 串。問它們的編輯距離是否能夠小於 \(N\)。若能夠,打印一種方案。
題解:首先這兩個串必須互爲 \(01\) 翻轉的串,不然經過修改來達到。注意到,子串裏出現 \(010\) 時必定能夠(去掉一個\(0\),加入一個 \(1\) 便可,能夠少一步操做)。再把剩下的狀況特判掉便可。
題意:給出《戰爭與和平》全集的txt文本。從中隨機挑選出至少爲 \(10^5\) 字節的連續的一段,並選擇一個字母,在它每個出現的地方有 \(50\)%的機率將其刪除。給出操做後的文章段落,判斷出少了哪一個字母。
題解:直接統計每一種字符出現百分比是不行的(可能和部分字母集中出如今某處有關)。有一個很simple的想法:固定了一個字母后,考慮每個包含它的單詞 \(s\)。咱們枚舉這個單詞對這個字母的全部刪除方式,獲得的不一樣的串叫作 \(s'\)。若是某個 \(s'\) 不是文中的單詞,也不是其他單詞刪除後的結果,那麼一見到它,咱們就能肯定出答案了。由於合法的 \(s'\) 不少,光作這些足以經過本題。咱們只需對每個字母篩選一些 \(s'\)(隨機選擇位置,確保有些能落在給定段落裏)並打表進去。
題意:交互題。\(s_0\) 未知,定義 \(s_i=s_{i-1} \cdot 65539 \mod 2^{31}\),\(x_i=s_i \mod 10^6\)。考慮有 \(N(\leq 10^8)\)個數,每一個數即爲 \(x_i\)。你要求對它們求和。第 \(i\) 次詢問時,你能夠知道 \(x_i\) 的值。
題解:所有問完確定會 TLE。注意到 \(s_i\) 的生成式能夠用位運算加速,因此咱們只需獲知一個 \(s_i\),就能夠暴力推出來求和了。
我開始採起了一個很複雜的方法來探尋 \(s\)。離線枚舉每個可能的 \(s\),暴力迭代直到有環,並推算出對應的 \(x\) 的數字環。設一個閾值 \(K=1000000\),對環上每連續 \(K\) 個數字進行哈希,結果爲它開頭的 \(s\) 的數值。對於被詢問值每 \(K\) 個連續數字都哈希一下,看看是否能找到。指望詢問 \(O(K)\) 個值便可。
其實這裏產生 \(x_i\) 的模數很大。咱們知道 \(x_1\) 後,\(s_1\)可能的值就只有 \(1000\) 種了。而後咱們能夠根據 \(x_2\) 繼續縮小可能的 \(s\)。據稱,最多問三次便可肯定 \(s\) ……
題意:有一個 \(N \times N (\leq 50)\)的棋盤,在其中放入 \(N\) 個象,使得全部格子都被(其或其攻擊範圍)覆蓋。求字典序第 \(K\) 小的放置方法。
題解:神題……
題意/題解:猜是哪一種機率分佈的題。直接算出每一種機率分佈,比較哪一種更像便可……
題意:有 \(N(\leq 3 \times 10^5)\) 個物品,每一個物品有實際大小 \(a_i\) 和容量 \(b_i\),\(a_i<b_i\)。若物品 \(i\) 和 \(j\) 知足 \(a_i<b_j\) 且 \(a_j<b_i\),則稱它們是合適的。依次放入這些物品,某時若是產生了矛盾(存在三個物品 \(i,j,k\) 知足 \(i\) 和 \(j\),\(j\) 和 \(k\) 是合適的可是 \(i\) 和 \(k\) 不合適)則扔掉該物品。模擬這個過程。
題解:比賽時沒看出來,這其實就是「線段模型」。將物品看作線段後,要求每一團可能相交的線段都要有公共的交。而後用set維護這一塊一塊線段集便可。
題意:給出 \(N(\leq 10^4)\) 個圓的半徑,找一種擺放方案,使得它們有公共的交點,且面積並最大。
題解:威威帶帶我[可憐]。
題意:給出 \(N(\leq 10^{18})\) 和 \(M(\leq 500)\)。對於 \(N\) 的每個劃分\(P\): \(N=a_1+a_2+\dots+a_M\)(不要求 \(a_i\) 升序),定義 \(f(P)\) 爲 \(P\) 中不一樣的數字的出現次數。求全部劃份方案的 \(f\) 值之和模一個大質數。
題解:設 \(F(x)\) 表示數字 \(X\) 的總收益,由容斥得 $F(x)=\sum \limits_{i=1}^{\min (M,\lfloor \frac{N}{X} \rfloor)} (-1)^{i+1} \cdot C_M^i \cdot C_{N-iX-1}^{M-i-1} $
外層還要對 \(X\) 求和,顯然須要加速。由於 \(M\) 只有 \(500\),更換求和順序可得 $ans=\sum \limits_{i=1}^M (-1)^{i+1} \cdot C_M^i \sum \limits_X C_{N-iX-1}^{M-i-1} $。把後面的組合數看作是關於 \(X\) 的 \(M-i-1\) 階多項式,則它們的和是高一階的多項式。直接插值便可。
題意:有一棵 \(N(\leq 10^6)\) 個點的有向樹,方向是從根往葉子。如今要給每一個點從新標號。按順序加入 \(N-1\) 條邊,要求任意一個時刻,每一個點能走到的點的標號是連續的。打印任意一種方案或無解。
題解:(from lsmll)按照加邊順序倒着刪邊。邊上維護P或者S標記表示前綴或者後綴。每次刪邊時向上找,直到到根或者要通過有標記的邊。若是到根,若是根已經有P和S,則無解,不然加一條沒有的標記。若是到一條路徑中間,則無解,不然延伸這條路徑的標記。注意已經刪除的邊以後就認爲沒有。若是有解,構造答案的話按照子樹大小搞一下。
題意:給 \(7 \times N\) 個點的無向徹底圖的邊染色。顏色必須是 \([1,N]\) 的一種。染完後,要求對於任何兩個點 \((u,v)\) 和任何一種顏色 \(c\),\(u \rightarrow v\) 只走顏色爲 \(c\) 的邊,最短距離不超過 \(2\)。
題解:考慮如何形式化地染色。顏色確定有某種程度上的對稱,因此咱們將點分爲 \(N\) 組(團),每組 \(7\) 個。每組表明一種顏色。
每組點之間的邊好辦,全連上本身組的顏色!那跨組呢?
對於顏色 \(i\) 組的點和顏色 \(j\) 組的點之間,沒有理由連其它顏色的邊。那究竟是連 \(i\) 仍是 \(j\) 呢?
回想咱們要實現的要求:對於任何兩個點 \((u,v)\)(不妨設 \(u\) 在顏色 \(i\) 組裏,\(v\) 在顏色 \(j\) 組裏)和顏色 \(c\),必定存在一個點 \(k\),使得 \(k\) 在顏色 \(c\) 的組裏,且\((u,k)\) 和 \((v,k)\) 的顏色都是 \(k\)。且大膽猜想,每組顏色 \((i,j)\) 間 \(7 \times 7\)的邊連法是一致的。
設 \(a_{x,y}=1\) 表示顏色 \(i\) 的第 \(x\) 個點和顏色 \(j\) 的第 \(y\) 個點之間連的是顏色 \(j\) 的邊,不然是顏色 \(i\) 的邊。
如今要嘗試構造出一種合法的矩陣 \(a\) 知足要求。顯然 \(a\) 是反對稱的,且根據要求,對於任意兩行 \((x,y)\) (\(x\) 和 \(y\) 意爲點 \(u\) 和 \(v\) 所在組的位置,固然也能夠相等),存在一個列 \(k\),使得 \(a_{x,k}=a_{y,k}=1\)。轉化一下,即任意兩行 \(and\) 值不爲0。
咱們能夠經過爆搜+剪枝來搜出符合要求的矩陣。
題意:\(N \times N (\leq 10^5)\) 裏放 \(k\) 個象且互不衝突,問方案數。\(k\) 從 \(1\) 到 \(2N-1\) 循環,把每一個解模NTT質數輸出。
題解:抱威威大腿。
題意:給出 \(N(\leq 2 \times 10^5)\) 個數的排列和 \(M\) 個操做。操做分爲兩種:①問位置 \(p\) 的數字是什麼。②將區間 \([1,x]\) 和區間 \([x+1,N]\) 執行歸併操做,獲得的結果覆蓋原排列。注意這裏是單純套用傳統歸併操做的作法,結果顯然不必定有序。
題解:暴力模擬歸併操做的具體過程,對於兩個正在歸併的數列 \(A\) 和 \(B\),不妨設 \(A_1<B_1\)。找到一個最大的 \(t\),使得 \(A_t<B_t\),而後將 \(A\) 的\([1,t]\) 放入結果數組,而後交替對 \(B,A\) 執行相似的操做。
咱們指望,若是對剪切和移動每段(固然不能是每個數)產生單位複雜度,總複雜度是科學的。
咱們引進一種工具block來證實這件事。將初始的 \(N\) 個數劃成一塊塊block,每一塊block知足,塊裏全部數字都不大於塊首(一旦出現,就分裂到下一個block去)。如今,咱們獲得了若干個block,且它們的首元素遞增。
對於一次歸併操做,它可能會劃在一個block的內部。左側依舊是完整的一塊,可是右側可能會分裂成不少小的block。考慮執行完歸併操做後的結果:這些小的block會依照它們的首元素,有序地「插入」到左邊的那些block裏面。且歸併的段數就是 \(O(新增小的block的個數)\)的。
自始至終,block的個數不會減小,最多爲 \(N\) (此時該排列已經有序)。因此總操做段數就是 \(O(N)\) 的。
咱們能夠用非旋轉treap很方便的維護序列的剪切和連接操做,總複雜度爲 \(O((N+M) \log N)\)。
題意:有一個函數,係數、自變量和函數值都是 \(0\) 或者 \(1\)。自變量有 \(N(\leq 2000)\) 個,記爲 \(x_1,\dots,x_N\)。係數有 \(2^N\) 個,記爲 \(a_S\)。函數表達式爲 $f(x_1,x_2,\dots,x_N)=\bigoplus \limits_{S=0}^{2^N-1} a_S \cdot \bigwedge \limits_{i \in S} x_i $。如今給出 \(M(\leq 2000)\) 組觀測結果(保證自變量取值兩兩不一樣),構造一組係數使得符合要求。輸出\(a_S\)取\(1\)的那些 \(S\)。
題解:表述複雜的傻逼題。對於一組 \(x_i\),設其集合爲 \(U\),至關於把 \(a_S (S \subseteq U)\) 給異或起來。由於自變量取值兩兩不一樣,沒有相同的 \(U\) 的觀測。因此咱們能夠把觀測結果按 \(U\) 中 \(1\) 的個數從小到大排序。每次決策一個觀測結果時,先把把全部 \(a_S (S \subset U)\) 的異或起來,若是與結果相反,再設 \(a_U\) 爲 \(1\) 便可。全程用bitset來加速。
題意:選擇 \(1\) ~ \(N(\leq 10^9)\) 中儘可能多的數使得任意兩個數都沒有整除關係。在這樣的條件下,使得總和最小。有 \(T(\leq 10^5)\) 組詢問,每次輸出最大的和。
題解:最大個數顯然是 \(\lfloor \frac{N+1}{2} \rfloor\) 個,只需取 $ \lfloor \frac{N+1}{2} \rfloor$ ~ \(N\) 便可。麻煩的是總和最小。
列出這樣一張表:第 \(i\) 行列出全部僅包含 \(2^i\) 因子的數(好比第 \(0\) 行是奇數)。每列最多選一個數(且選最底下那個必然合法)。設\(f_i\)表示第 \(i\) 列最終選了啥。能夠證實,\(f_i \geq f_{3i}+1\),且這個下界能夠達到。
題意&題解:最大生成樹。
題意:多組詢問。每次給出 \(N\) ,找到三個正整數 \((x,y,z)\) 使得 \(x|N,y|N,z|N,x+y+z=N\),且 \(xyz\) 最大。
題解:由均值不等式,\(N\) 是 \(3\) 的倍數時顯然。當 \(N\) 是 \(4\) 的倍數但不是 \(3\) 的倍數時,能證實 \(\frac{N}{2},\frac{N}{4},\frac{N}{4}\)是最優解。打表發現其餘不存在解。
題意:給出 \(N(\leq 10^5)\) 個括號序列。以必定的順序把它們接在一塊兒,使得造成的括號序列合法子序列的長度最長。
題解:一道很old的題想了好久。顯然每一個序列先匹配一下,變成形如「)))……((("的形式。事實上,以後不存在一種排序的方案,使得最優解的一種是它們順次接起來。考慮一個帥氣轉化:合法子序列的長度徹底取決於前綴最小值的大小。
題目轉化成,咱們要讓前綴最小值儘量的大。首先將這些二元組分紅兩部分,"("多的和")"多的。顯然,前者確定整體都在後者前面。對於前者,每次通過前綴和都會增長,因此是按')'遞增排;後者則相反。
題意:給出 \(3N\) 個點。每三個一組,使得構成的三角形沒有交。
題解:標算給出的作法是:每次找凸包的一條邊 \(AB\),再找一個與其夾角最小的點 \(C\),每次刪除 \(ABC\) 便可。
實際上直接按橫座標排序,依次分組便可。
題意:有 \(N(\leq 10^5)\) 個位置,每一個位置填正整數。給出 \(M(\leq 10^5)\) 個限制,要求 \([l,r]\) 這一段數字兩兩不一樣。求最小字典序方案。
題解:將互相包含的無效區間刪掉,區間左右端點遞增。遇到新的一段每次貪心地填最小的數字。彈出舊的一段就把那些數字都回收。這至關因而動態維護mex,線段樹便可。
題意:初始時有一條邊。有若干次操做:每次選擇一條邊 \(e=(x,y)\),複製一份,並在中間加入 $ k (k \geq 0)$ 個點(即連上 \((x,u_1),(u_1,u_2),\dots,(u_k,y)\) 這些邊)。如今給出 \(N\) 個點,\(M\) 條邊(\(N,M \leq 10^5\))的操做後的圖(具體操做未知)。每條邊會有一個邊權,求此圖的最大權匹配以及方案數。
題解:若是知道了圖是怎麼生成的,咱們能夠很方便的進行dp。設 $F_{E,u,v} $表示一段邊 \(E\),「最左側和最右側的點是否在匹配裏」的最大匹配以及方案數。鏈上一條一條dp過去,最後獲得一些重邊再merge一下。
考慮最後一次添的點,度數必然都是2。咱們能夠逆着來還原這個操做:每次找到一個度數爲2的點,將其刪掉,並在它連出去的兩個點之間連上一條邊。還原的同時還能夠直接dp,直接在每一條邊上記錄\(2 \times 2\)的匹配信息。
有一個須要注意的地方:匹配信息是和這條邊的起點/終點相關的。要給每條無向邊定一個方向。
題意:給出一個\(n=2000\)的正整數序列\(s_i (\leq 10^9)\)。定義 \(A_i=s_{i \mod n}+n \cdot \lfloor \frac{i}{n} \rfloor\)。對於一組\((l,r)\),定義\(f(l,r)=\sum \limits_x x \cdot cnt_x^2\),其中 \(x\) 是 \(A\) 中區間 \([l,r]\) 裏全部出現過的數字,\(cnt_x\)是它們出現的次數。
如今給出 \(a,b (\leq 10^{18})\),求 \(\sum \limits_{a \leq l \leq r \leq b} f(l,r)\)。
題解:有一步重要的轉化。\(f(l,r)=\sum \limits_{p=l}^r \sum \limits_{q=l}^r [A_p=A_q] \times A_p\)。
由於要對全部的\((l,r)\)求和,一個很顯然的變換是:
\(\sum f(l,r)=\sum \limits_p \sum \limits_q [A_p=A_q] \times A_p \times (\min(p,q) - a+1) \times (b - \max(p,q) +1)\)。
注意到 \(p,q\) 會很大,而\(n \leq 2000\)。不妨設\(p=i+k_1 \times n,q=j+k_2 \times n\)。
咱們的思路是,枚舉 \(i\) 和 \(j\),計算對應的貢獻。
列出\(A_p=A_q\)的要求,即\(s_i+k_1 \times n=s_j+k_2 \times n\)。即\(s_i-s_j\)必須是\(k_2-k_1\)的倍數。若是咱們枚舉 \(k_1\),那麼 \(k_2\) 也就定了,不妨設其爲 \(k_2=k_1+t\) 。由 \(a \leq p,q \leq b\),能夠求出 \(k1\) 的下界 \(L\) 和上界 \(R\)。如今,咱們再把 \(k_1\) 和 \(k_2\) 帶入上述的求和式裏,整理一下會獲得 \(\sum f(l,r)=\sum \limits_{k=L}^R c_0+c_1 k+c_2 k^2+c_3 k^3\),\(c_i\)是常數。\(O(1)\)算一算便可。
題意:\(a_1=1,a_2=2,a_n=a_{n-a_{n-1}}+a_{n-1-a_{n-2}}\)。\(T(\leq 10^5)\) 組數據,求 \(\sum \limits_{i=1}^N a_i (N \leq 10^{18})\)。
題解:打表發現,每個正整數都會在數列裏出現,且數列是不降的。咱們記 \(f_i\) 表示數字 \(i\) 出現的次數,會發現 \(f_i\) 即爲 \(i\) 中含有的 \(2\) 的冪次加一。因此咱們先二分第 \(N\) 個數是多少,每次斷定數字 \(1\)~\(mid\) 一共會佔用多少個格子。最終的和是一個等差數列。
題意:給出一個 \(N(\leq 10^6)\) 個數字的排列 \(A_i\)。如今要生成相同長度的數組 \(B_i\),每個數是 \([0,1]\) 的隨機實數。
設 \(f_p(l,r)\) 表示數組 \(p\) 中,區間 \([l,r]\) 裏最大的數的下標。若是對於全部的 \((l,r)\),\(f_A(l,r)=f_B(l,r)\),則稱 \(A\) 和 \(B\) 是 Similar 的。
若是 \(A\) 和 \(B\) 是 Similar 的,設收益爲 \(\sum B_i\),不然收益爲 \(0\)。求指望的收益和。
題解:比賽裏用了帥氣的積分作法。
先考慮一個簡單的case:\(N\) 個獨立變量 \(x_i\) 均在 \([0,1]\) 等機率隨機,求最大值的指望。設 \(F_x\) 表示最大值 \(\leq x\) 的指望,顯然 \(F_x=x^n\)。求導後獲得機率密度函數 \(f_x=n \cdot x^{n-1}\)。那麼最大值指望就是 \(\int_0^1 x \cdot f_x \,dx=\frac{n}{n+1}\)。
本題中,每次對 \(A\) 的最大值分治。這樣,要求 \(B\) 的最大值也位於此,且兩側獨立了。若是是Similar的收益是 \(1\),不然是 \(0\),那麼指望收益就是 \(\prod \frac{1}{L}\),\(L\) 是每次分治區間的長度 (至關於強制最大值是某個位置)。
要計算 \(B_i\)的和的指望,考慮繼續積分。枚舉當前的最大值 \(x\),獲得指望和爲:\(\int_0^1 n \cdot x^{n-1} \times (g_L(x)+g_R(x)+x) \,dx\)。其中 \(g_L(x)\) 表示,若是左區間的每一個數正好都隨機在 \([0,x]\),指望和是多少。由指望的線性性,咱們有理由相信,\(g_L(x)=x \times g_L(1)\),這樣就能繼續劃成子問題遞歸下去了(每一段的問題都是:求解 \(g_{seg}(1)\))。
其實存在更 \(simple\) 的想法。若是隻是要求 Similar 的機率,至關因而給 \(B\) 定義個大小關係的排列,使得知足樹上的拓撲序要求。這個能夠直接套一下定理算一下。而對於每一種合法的大小關係的排列,其指望和必然是 \(\frac{n}{2}\)!因此該問題就解決了……
題意:給出 \(k (\leq 25)\) 個質數 \((p_i \leq 100)\) 和一個數 \(N (\leq 10^{18})\)。若只能用這些質數,能拼出的不超過 \(N\) 的最大的數是多少。
題解:看上去一副只能爆搜的樣子。注意一些有效的剪枝,好比預處理 \(f_i\) 表示 \(\leq i\) 的數中的最大可行數。若當前乘積 \(cur\) 知足 \(\frac{N}{cur} \leq K\) 時中止搜索,直接乘上 \(f_{\lfloor \frac{N}{cur} \rfloor}\) 便可。
實際上能夠meet in the middle。把質數儘可能均勻地分紅兩組,每組直接搜出全部能拼成的數並排序(個數不會不少)。而後兩個指針掃一掃便可。
注意到,這麼作是會超內存的。
其實有個簡單的trick能讓meet in the middle的內存從 \(O(\sqrt N)\) 降低到 \(O(\sqrt[4] N)\)。
對於這兩組質數,討論哪一組對答案的貢獻 \(\leq \sqrt {ans}\)。不妨設是第一組。先暴力搜第一組,一樣把能拼成的數存在來並排序。第二組在搜索的時候,不用存數字了,直接在第一組的數組裏二分找答案便可。
題意:給出 \(N\) 個二維平面的點。用一條折線(只能折一次)去擬合它們,使得每一個點 \(y_i\) 到折線上的 \(y\) 的平方和最小。
題意:求第 \(K (\leq 10^{18})\) 小的長度爲 \(N (\leq 250000)\) 的排列,知足逆序對數等於順序對數。
題解:預處理 \(f_{i,j}\) 表示 \(1\) ~ \(i\) 的排列中,逆序對數量 \(=j\) 的方案數。打表發現 \(i > 100\) 時, \(j < 16\) 纔有意義(不然值 \(> 10^{18}\))。
逐位肯定,記錄填到如今還剩多少逆序對 \(cur\)。暴力的作法時,從小到大枚舉每個沒填過的數字 \(j\)。假設它是第 \(k\) 個被枚舉到的,填了它的方案數就是 \(f_{n-i,cur-(k-1)}\)。和目前的 \(K\) 比較一下便可。
根據提過的性質,當 \(n-i>100\) 時,某時若 \(f_{n-i,cur-(k-1)}\) 有值,最多枚舉 \(16\) 次必然能肯定填的數。
有一個須要注意的地方是,最開始枚舉的若干個數方案數可能均是 \(0\)(由於填了它後,後面的最大逆序對數量也達不到 \(cur-(k-1)\) 了)。因此要先設 \(k=max(1,cur-\frac{(n-i) \times (n-i-1)}{2}+1)\),從第 \(k\) 小的能夠填的數開始暴力枚舉便可。
找第 \(k\) 小的數能夠用權值線段樹,找下一個數能夠用並查集,因此總複雜度是 \(O(N \log N+16N)\)。
題意:有 \(M\) 個長度爲 \(N\) 的字符串。第一個串給定,以後每一個串都是在前一個串的基礎上,把第 \(x_i\) 個位置修改成 \(y_i\) 上造成的。將它們按字典序排序。
題解:直接創建可持久化線段樹,在樹上哈希便可。
題意:設計一個小程序,要求最多有 \(k(\leq 50)\) 行,每行兩個字符串 \(a_i\),\(b_i (len \leq 8)\)。編譯器會按照下圖的邏輯執行。讀入的 \(s (|s| \leq 100)\) 是任意的形如 \(x+y\)的字符串,\(x\) 和 \(y\) 是二進制數。要求輸出的 \(s\) 是對 \(x\) 和 \(y\) 執行二進制加法後的結果。
題解:抱緊lsmll學長大腿。
題意:給出一個 \(N(\leq 18)\) 的有向圖。要構造一個點的序列 \(s\),知足對於任何一條邊 \((i,j)\),序列裏最左邊的 \(i\) 右邊必須有一個 \(j\)。求最小長度。
題解:有點帥氣的狀壓。倒着DP,設 \(f_S\) 表示末尾已經填過 \(S\) 這個數集,且 \(S\) 裏這些數也已知足限制的最小長度。每次枚舉往前填的數字 \(i\)。若是 \(i\) 的全部出點全在 \(S\) 裏,用 \(f_S+1\) 去更新;不然用 \(f_S+2\) 去更新(意爲目前已經產生環了,先填一個 \(i\) 去知足左側數字的要求;等全部數字全填完後,在整個序列最開頭再補一個 \(i\) 來知足 \(i\) 的限制)。
題意:給出 \(\frac{c}{d}(c<d \leq N)\),求最簡真分數 \(\frac{a}{b} (a<b \leq N,gcd(a,b)=1)\) 的個數,知足 \(\frac{a}{b} \leq \frac{c}{d}\)。
先不考慮互質,限制能夠化爲 \(ad \leq bc (b \leq N)\),即 \(f(N)=\sum \limits_{b=1}^N \lfloor \frac{bc}{d} \rfloor\)。
考慮互質的話,枚舉 \(d=gcd(a,b)\),把 \(\mu(d) \times f(\lfloor \frac{N}{d} \rfloor)\) 加入答案便可。
如今考慮 \(f(N)\) 怎麼求。
擴展成通常性的類歐幾里得問題:求 $ \sum \limits_{i=0}^N \lfloor \frac{ai+b}{c} \rfloor $。
當 \(a \geq c\) 時,能夠先把 \(\lfloor \frac{a}{c} \rfloor\) 移出來直接統計答案;\(b \geq c\) 時也相似。即:
\(f(a,b,c,N)=\frac{(N+1) \times N}{2} \times \lfloor \frac{a}{c} \rfloor+N \times \lfloor \frac{b}{c} \rfloor+f(a \mod c,b \mod c,c,N)\)
那麼如今 \(a,b<c\) 了(這麼討論能夠防止下面推導過程產生負數)。
設 \(M= \lfloor \frac{aN+b}{c} \rfloor\) (右端點值)。推導關鍵在於,將下取整變成求和式。
\(\sum \limits_{i=1}^N \lfloor \frac{ai+b}{c} \rfloor\)
\(=\sum \limits_{i=1}^N \sum \limits_{j=0}^{M-1} [\lfloor \frac{ai+b}{c} \rfloor \geq j+1]\)
\(=\sum \limits_{i=1}^N \sum \limits_{j=0}^{M-1} [ai \geq cj+c-b]\)
\(=\sum \limits_{i=1}^N \sum \limits_{j=0}^{M-1} i > \lfloor \frac{cj+c-b-1}{a} \rfloor\)
\(=\sum \limits_{j=0}^{M-1} (N- \lfloor \frac{cj+c-b-1}{a} \rfloor)\)
\(=NM-f(c,c-b-1,a,M-1)\)
觀察第一維和第三維,能夠發現,總複雜度和歐幾里得同樣。
題意:給出 \(N,M(\leq 10^9)\),求 \(\prod_{i=0}^m (n \bigoplus i)\)。對一個大質數取模。
題解:對 \(M\) 進行數位DP。每次某位是 \(1\) 但決策放成 \(0\) 時,由於後面部分的異或值必然是 \(0\) ~ \(2^{n-i}-1\),因此要快速計算 \(\prod_{i=0}^{2^{n-i}-1} (x+i)\),\(x\) 是以前得到的異或和。這本質就是求兩個階乘。階乘是經典的不可求問題(不考慮構造多項式的作法),分段打表便可。
題意:給出 \(N(10^9)\),求合法三元組 \((a,b,m)(0 \leq a,b < m)\) 的個數,知足至少存在一組 \(x\) 和 \(y\),使得 \(x^2+y^2=a(\mod m)\) 且 \(xy=b(\mod m)\)。
題解:設 \(f(x)\) 爲 \(m=x\) 時的個數。發現 \(f\) 是積性函數,因此咱們只考慮 \(p^k\)。
當 \(p\) 是奇數時,轉化爲考慮三元組 \((a+2b,a-2b,m)\) (顯然一一對應)。
在模意義下,方程必然有解,因此二者獨立。咱們只要保證它們存在二次剩餘便可。
再轉化爲求 \(m\) 下二次剩餘的個數,答案就是個數的平方。
從 這個博客 可能能夠得到啓發。個數爲 \(\sum_{2i \leq k} \frac{\phi(p^{k-2i})}{2}\)。
題解說,\(p=2\) 時存在線性遞推。(其實應該有很顯然的規律)
題意:給出一個矩陣\((x1,x2,y1,y2)(|x2| \leq 10^9,|y2| \leq 10^{18})\) 和 \(N(\leq 10^5)\) 條直線 \(a_i x+b_i(a_i \leq 10^9,b_i \leq 10^18)\)。求二元組 \((i,j)\) 對數,使得直線 \(i\) 和直線 \(j\) 有交,且交在矩陣裏面或邊界。
題解:剔除全部與矩陣沒有交的直線。通常地,直線會與矩形有兩個交點。若是 \(i\) 和 \(j\) 交在內部,則它們與矩陣的交點是交錯的。因此這就變成了一個二維數點的問題。把交點離散化後,掃描線+樹狀數組便可。注意特判只有一個交點的直線。
此題卡精度,必須用分數類。得到新姿式:分數類不用記錄正負號,只要把負號放在分子裏,比較大小時直接分母乘一下比較便可。
題意:多組數據。對於一張無向圖,稱三元組 \((i,j,k)(i < j)\) 是 \(bridge\),當期僅當 \((i,k),(j,k)\) 有邊,但 \((i,j)\) 無邊。求點數爲 \(N(\leq 1000)\),\(bridge\)個數不超過 \(K(\leq 8)\)的無向圖個數。
題解:打表能夠發現,若是一張 \(N\) 個點的連通圖不是團,它至少有 \(N-2\) 個橋。
證實:概括法。若一張連通圖至少有一組橋 \((i,j,k)\),加入一個新點 \(t\) 後,橋的個數至少 \(+1\)。考慮和 \(t\) 連邊的點 \(u\):要不 \(u\) 是中轉點,要不 \(t\) 和全部點都有邊,此時 \(t\) 是中轉點(橋 \((i,j,t)\)造成)。
因此對於圖中的每一個連通塊,若是點數 \(\geq 10\),必然是個團。那麼咱們能夠先爆搜出 \(p(p \leq 10)\) 個點,\(q\) 個橋的連通圖的個數。而後把整張圖DP起來。
爆搜時注意用位運算來壓掉一個 \(n\)。要跑很久。
題意:給出一個長度爲 \(N(\leq 10^5)\) 、字符集爲 \(12\) 的字符串。對於每個後綴都要詢問:在字符全部雙射的方案構成的 \(12!\) 種串中,是否存在一個串,使得它在這個串裏是後綴最大的。
題解:考慮 \(N^2\) 暴力。詢問 \(i\) 時,枚舉後綴 \(j\),設 \(k=lcp(s_i,s_j)\),有個要求是:\(s_{i+k}>s_{j+k}\)。考慮一張 \(12\) 個點的拓撲圖,那麼咱們從 \(s_{i+k}\) 向 \(s_{j+k}\) 連一條邊,意爲前者要大於後者。最後獲得的圖若是沒有環,必然有一種拓撲序列,就必然有解。
如今的問題是,如何獲得每個後綴的圖。考慮創建後綴樹,一個後綴的全部限制,產生在它到根路徑上的全部分叉上。因此從根開始DFS,維護一張圖表示從根到目前的點 \(x\) 得到的限制。能夠用位運算加速,這樣只需維護 \(12\) 個數。不過最後找環是 \(12^2\) 的,因此複雜度就是 \(O(144N)\)。
題意:給出一個長度爲 \(N(\leq 10^5)\) 的數字串。如今要選擇一些不相交的區間把它們刪去,使得剩下的串每種數字最多出現一次。每一個選擇區間的長度必須大於 \(1\),且必須首字符和尾字符相等。只要刪除位置的集合不一樣,就算不一樣的方案。求方案數模大質數後的值。
題解:設 \(f_{i,S}\) 表示考慮前 \(i\) 位,剩下的數字集合是 \(S\) 的方案數。轉移的話,要不留下這個數,從 \(i-1\) 處轉移;要不刪除這個數,枚舉一個 $j<i,從 \(f_{j,?}\)裏轉移過來。注意要求 \(a_i=a_j\),因此能夠對數字創建一個輔助DP,就不須要每次枚舉 \(j\) 了。
題意:給出一棵 \(N\) 個點的樹。每次能夠選擇兩個連通的點 \(u\) 和 \(v\),把它們路徑上的邊都刪掉。求最小的刪的次數,使得全部邊都被刪掉。
題解:考慮直接 DP。設 \(f_i\) 表示到點 \(i\) 子樹內部分配完刪邊方案的最小值,\(g_i\) 表示還有向上的一條鏈的最小值,轉移便可。
題意:給出一張 \(N(\leq 5)\) 個點的無向圖,表示時刻 \(T=0\) 的連通訊息。每過一單位時間,隨機一條邊,將其存在性翻轉。有 \(1000\) 組詢問,每次給出 \((L,R) (L \leq R \leq 10^{18})\),詢問 \(L\)~\(R\) 中至少有一個時刻圖是連通的機率。答案對大質數取模。
題解:容斥後是求全不連通的機率。作法分爲兩個步驟:求出到時刻 \(L\) 時不連通的機率;求出從時刻 \(L\) ~ \(R\) 一直不連通的機率。
設 \(M=\frac{N \times (N-11)}{2}=10\),因此邊集狀態是 \(S=2^{10}=1000\)。打表發現,其中不連通圖個數 \(K=296\) 種。
對於第一問,直接矩乘複雜度是 \(O(S^3 \log R+Q \times S^2 \log R)\),顯然會 \(TLE\)。其實咱們能夠直接枚舉 \(L\) 時刻的一種不連通的狀態 \(U\),強行算它出現的機率。對於這 \(M\) 條邊,有些邊存在性和 \(T=0\) 時相同,有些相反。咱們能夠設 \(f_{i,j}\) 表示:到時刻 \(i\),有 \(j\) 條邊存在性和初始圖不一樣的機率。由於 \(j \leq 10\),直接對 \(i\) 矩乘便可。那麼對於這種邊集狀態 \(U\),如有 \(e\) 條邊和初始時相反,它出現的機率就是 \(f_{L,e} \times C_{M,e}\)。這樣,第一步咱們在 \(O(10^3 \log R+ Q(10^2 \log R+K))\) 時間內解決。
對於第二問就不能這麼優化了,由於咱們要保證中途經歷的圖都是 \(K\) 種之一的。此時考慮壓縮矩陣的大小。雖然不連通的有 \(K\) 種,可是本質不一樣的只有 \(13\) 種。因此就把矩陣大小壓成 \(13\) 了。這一步複雜度是 \(O(13^3 \log R+Q \cdot 13^2 \log R)\)。
題意:有一個長度爲 \(N(\leq 1000)\) 的 \(01\) 串未知,要交互探知。每次能夠詢問 \((L,R)\),有50%的機率返回 \(L\)~\(R\) 之間的 \(1\) 的個數;還有50%的機率等機率返回 \([0,R-L+1]\) 中非正確答案的數值。一樣的區間最多隻能問一次。要在 \(60000\) 步以內得到該串。
題解:考慮 \(501\)~\(1000\) 怎麼肯定,反之亦然。咱們的目的是,嚴格肯定出 \(sum_{1-500},sum_{1-501},sum_{1-502},\dots\) 這些區間的和,這樣答案也就出來了。首先是 \(sum_{1,500}\)。作法很簡單,咱們不只能夠問 \((1,500)\),還能夠問 \((1,x)\) 和 \((x+1,500)\),把二者加起來便可。問足夠屢次後,找到出現次數最多的數字,其必然就是 \(sum_{1,500}\) 。日後考慮 \(sum\) 時,就沒必要刺探這麼屢次了,由於 \(sum_{1,i-1} \leq sum_{1,i} \leq sum_{1,i-1}+1\),全部不在這個區間裏的值必然是錯的,直接無視。
題意:你想從 \((x,y)(|x|,|y| \leq 10^9\) 走到 \((0,0)\),每次只能走整數座標。初始時你有一顆六面都是 \(1\) 的骰子。每輪,交互器先給你一個新骰子(六面都是 \(1\)~\(10000\)的隨機數),你能夠選擇是收下或者扔掉;而後交互器會把你的全部骰子都丟一遍,把朝上的數字之和 \(s\) 給你。以後你必須從原來的位置 \((x_0,y_0)\) 走到新的位置 \((x_1,y_1)\),知足 \(\lfloor \sqrt {(x_0-x_1)^2+(y_0-y_1)^2} \rfloor=s\) 或 \(\lceil \sqrt {(x_0-x_1)^2+(y_0-y_1)^2} \rceil=s\)。要求在 \(60000\) 輪內走到 \((0,0)\)。
題解:發現 \(s\) 是不可控的,因此保留的骰子數量 \(K\) 必定不多,這樣全部可能的 \(s\) 咱們都能掌握。
大體想法是這樣的:設 \(R\) 是可能的最大的 \(s\)。以原點爲圓心畫一個半徑爲 \(R\) 的圓。當離 \((0,0)\) 遠的時候,直接往原點方向走便可;而一旦走到了圓上,不管下一步 \(s\) 是什麼,咱們都要keep在圓上(由於 \(R\) 是最大的 \(s\) ,任何 \(s\) 都能找到一條合法的弦走過去)。這樣,只要某次擲出 \(R\),咱們就能走回 \((0,0)\) 了。
細節仍是挺多的。走到原點附近的指望步數是 \(\frac{10^9 \cdot \sqrt 2}{6sum_i}\),因此骰子的數字和要儘量的大;最後擲出 \(R\) 的機率是 \(\frac{1}{6^K}\),因此骰子個數要儘量的小。爲此,我設了參數 \(K=4\) (指望幾千步就能取到 \(R\))。而後爲了使和儘可能大,先扔 \(5000\) 次骰子,把每次 \(sum \geq 47500\) 的骰子保留(實測大概會有 \(10+\) 個,因此保留 \(4\) 個綽綽有餘)。這樣基本不會超過步數限制。
還有一個很頭疼的問題是,必需要整數座標。好比在圓上繞圈圈時,找到符合要求的整點很頭疼。每次我是先拿 \((0,0,R+0.5)\) 和 \((x,y,s)\) 作一遍圓交,交點 \(p\) 默認是最優參考點。而後我把 \(p\) 附近的一塊矩陣拿出來,把其中的整點都納爲考慮對象。最優的點是 \((R-1)^2 < x^2+y^2 < (R+1)^2\) (能一步到原點),若是沒有,咱們就取儘可能靠近這個範圍的點便可。
題意:給出一個長度爲 \(N(\leq 10^6)\) 的 \(01\) 串 \(S\)。對於一個區間 \((l,r)\),定義 \(f_{i,j}=max(k | 0 \leq k \leq j-i,S[i..i+k-1]=S[j-k+1..j])\)。
要求全部 \(f(l,r)\) 的和。讀入 \(seed\),\(S\) 是按如下方式生成的。
題解:因爲數據是隨機生成的,能夠認爲,最大的答案 \(K \leq 45\)。枚舉起點 \(i\),反着統計:對於一個串 \([i,i+k-1]\),統計它會對哪些 \(j\) 產生貢獻。假設咱們簡單地統計一下 \([i..n]\) 中該串的出現次數,設爲 \(f_k\)。注意這個 \(f_k\) 不是真正 \(k\) 的貢獻,由於可能會重複統計。對於兩個串 \([i,i+k1-1],[i,i+k2-1](k1<k2)\),若是前者是後者的子串,前者就會重複統計。因此咱們能夠再倒着枚舉 \(k\),\(g_k=f_k-\sum \limits_{j=k+1}^K [S_k \in S_j] \cdot g_j\)。
對於求 \(f_k\),咱們能夠倒着枚舉 \(i\),倒着日後綴自動機裏添加點。詢問時,從 \(K\) 開始倒着循環,實時維護目前區間所在的點,每次彈出當前區間的第一個位置的字符。計算 \(g_k\) 時能夠用 kmp 來計算。總複雜度是 \(O(N(K+k^2)\),\(K\) 是最大可能答案,\(k(\approx 17)\) 是不一樣的 \(i\) 的平均最大答案。
題意:給出兩個長度爲 \(N(\leq 2 \cdot 10^5)\)的數組 \(a\) 和 \(b\),設 \(c_k=\sum \limits_{i=0}^k \binom{k}{i} a_ib_{k-i} \mod 2^{32}\)。輸出 \(c\) 數組。
題解:簡單化一化,設 \(A_i=\frac{a_i}{i!}\),對 \(A\) 和 \(B\) 做卷積。可是 \(i!\) 裏包含 \(2\) 的冪次,不能簡單地求逆元。
顯然要把 \(2\) 的因子分開。經典結論: \(k!\) 裏 \(2\) 的因子正好有 \(k-bit(k)\) 個。
設 \(p_i\) 是 \(i!\) 裏除掉全部 \(2\) 的因子後的結果。因此 \(c_k=k! \sum \limits_{i=0}^k \frac{a_i}{i!} \frac{b_{k-i}}{(k-i)!}=\frac{p_k}{2^{bit(k)}} \sum \limits_{i=0}^k \frac{a_i \cdot 2^{bit(i)}}{p_i} \frac{b_{k-i} \cdot 2^{bit(k-i)}}{p_{k-i}}\)。
咱們能夠把 \(A_i\) 當作兩個數值 \(\frac{a_i}{p_i}\) 和 \(bit(i)\) 的合成。對其作(權值分段的) \(FFT\) 便可,隨後把答案除掉 \(2^{bit(k)}\) 便可。數值會達到 \(2^{32} \cdot 2^{17} \cdot 200000\),爲防止超過 \(LL\),能夠對 \(2^{50}\) 取模。
題意:有一張 \(N(\leq 10^5)\) 個點和 \(M(\leq 2.5 \times 10^5)\) 的有向圖。依次往圖裏加邊,每加一條,詢問目前圖中有多少點對 \((u,v)\),知足 \((u,v)\) 能夠互相到達。
題解:本質上就是要實時維護強連通份量。可是這是論文題,不可作。
其實有一個精妙的總體二分作法。設 \(solve(l,r,E)\) 表示正在作時間軸上的 \((l,r)\) 區間,目前等效邊集是 \(E\)。設 \(mid=\frac{l+r}{2}\),先把 \(E\) 中全部出現時間 \(\leq mid\) 的邊拎出來,跑一遍 tarjan。而後思考:對於一條在強連通份量裏的邊,它對於 \([mid+1,r]\) 是無效的(咱們只需把這些點縮起來好了);同理,對於一條不在SCC裏的邊,它對 \([l,mid]\) 是無效的(由於加入了 \([l,mid]\) 全部邊,都沒有造成環,刪了一些邊後確定也沒有)。因此 \(E\) 能夠劃成兩個不交的集合。這樣複雜度就變成了 \(O(M \log N)\)。
題意:給出 \(N \times M(N,M \leq 110)\) 的格子圖。要在裏面選出 \(M\) 個格子,每列正好選一個。要求選的最多的行和選的最少的行的差儘可能小。知足這個條件下,使選取的格子上的數字的最大值儘可能小。
題解:判一下便可肯定最小的差是多少。而後二分一下跑上下界網絡流便可。
題意:有 \(200\) 組數據。給出 \(N(\leq 16)\) 個二維座標的點,起點位置爲 \((x0_i,y0_i) (|x| \leq 10^6)\),單位時間的速度向量是 \((vx_i,vy_i)(|v| \leq 1000)\)。問 \(0\)~\(T(\leq 1000)\) 時間裏,這些點之間的最小生成樹最小是多少。
題解:相似一道TC經典題。任意兩點間的距離形如 \(\sqrt{At^2+Bt+C}\)。兩兩枚舉這 \(N^2\) 個距離,求出它們的交點 \(t\) 並設爲關鍵點。容易發現,當 \(t\) 處於關鍵點之間的一段時,邊的大小關係是肯定的,因此最小生成樹上的邊也是肯定的。咱們只需對這些函數的和在 \([t_i,t_{i+1}]\) 中求個最小值。
凸函數之和仍然是凸函數。
題意:稱一個串 \(s\) 是 \(doublindrome\) 的,當且僅當它是個迴文串,且它能夠拆成兩個非空迴文串 \(a\) 和 \(b\) 的和。給出一個長度爲 \(N(\leq 10000)\) 的串,求它全部長度 \(\geq k\) 的 本質不一樣的 \(doublindrome\) 的子串的個數。
題解:本質不一樣的迴文串個數是 \(O(N)\) 的,因此咱們能夠用 \(manacher\) 暴力找到全部迴文串。如何判它是 \(doublindrome\) 的呢?猜想它必定有一個循環節,即 \(s=xx \dots x\)。因此直接對其跑一遍 \(kmp\) 便可。
題意:一個圓的圓周上均勻刻着 \(1\) ~ \(N(\leq 8000)\) 這 \(N\) 個數字。給出 \(\frac{N}{2}\) 條線段,分別鏈接兩個不一樣的點。找到儘量多的線段集合,使得它們兩兩都有交。求最大集合的大小。
題解:先固定一條線段 \(l_0\)。假設先有一條線段 \(l_1\) 與其有交。接下來與它們都有交的直線 \(l_2\) 兩側的端點知足必定的單調性。若是咱們把 \(l_0\) 一側的點的從新標號爲 \(1,2,\dots\),另外一側必須取出一個逆序的序列才能符合要求。因此此題就轉化成了 \(LIS\)。
題意:給出一張 \(N\) 個點 \(M(\leq 10^5)\) 條邊的有向圖,每一個點有個點權。從 \(1\) 出發,每奇數次到的點都能得到它的點權(能夠重複通過點,但不能重複得到點權),能夠在任意點結束。問最大收益。
題解:首先先縮環成點,必定是按照拓撲序走過去的。對於一個SCC,若是它至少存在一個奇環,全部點都能取到;不然要奇偶染色,只能取某種奇偶性的點權。不妨設 \(come_{x,0/1}\) 表示從以前的SCC在奇數/偶數步進入點 \(x\) 時,以前能得到的最大收益。設 \(go_{x,0/1}\) 表示環裏走完後,在奇數/偶數步從 \(x\) 出去的最大收益。根據是否有奇環分狀況轉移便可。