題意:給定n個數字,要求劃分成k的連續段使得每個連續段內的數字之和相同,求最大的k。n,σai<=10^6。
演算法:模擬
題解一:記sum=σai,從大到小列舉sum的因子暴力o(n)判斷,10^6範圍內的因子個數至多200~300個,且資料無法構造卡到上限(中途退出),可以輕鬆通過。
題解二:統計所有字首和記錄到同陣列b中(即b[i]表示存在大小為i的字首和),從大到小列舉sum的因子x後,計算每乙個k*sum/x(1<=k<=x)在b中是否出現即可。複雜度o(\(\sigma_1(sum)\)),其中\(\sigma_1(sum)\)表示sum的約數和。
題意:給定n個0~m-1的數字,每次操作可以在模m意義區間+1或區間-1,求最少幾次操作可以使所有數字變成0。n,m<=10^5。
演算法:差分+貪心
題解:如果不考慮模m意義就是一道經典題目。差分後區間操作變成一次+1和-1。差分後實際上有n+1個數字,而第n+1個數字可以任意改變。那麼差分後正數之和為a,負數之和為b,那麼ans=max。
現在考慮模m意義,把所有數字轉化為非負數,要選擇一些數字變成0,另一些數字變成m。為了使答案盡可能小,變成0一定優先選小,變成m一定優先選大,所以排序後貪心從兩邊取維護a和b的平衡即可(也可以列舉分界點。
複雜度o(n)。
題意:給定n個點的帶點權樹,每天早上根的數字變成0,每天下午每個點的數字往根移動,每天晚上會有一些單點加值的操作。給定m個操作,每個操作在第ai天晚上在點bi加上數字ci。給定k個詢問,每次詢問第ai天凌晨的【以bi為根的子樹】的數字和。n,m,k<=10^5。
演算法:cdq分治 或 樹套樹
題解:先不考慮修改操作,對每個點x記深度d[x],dfs序入棧序in[x]和出棧序out[x]。乙個點x會在詢問(ai,bi)中被統計當且僅當滿足\(d_x \leq a_i\)且\(in_ \leq in_x \leq out_\)。關鍵在於把子樹看成dfs序後,這就是個二維偏序問題了。
對於修改操作(ai,bi,ci),將深度維改為深度+時間維,所有初始節點時間預設為0,修改就在bi下面接乙個時間為ai權值為ci的點即可。
但是這樣還有乙個問題,就是由於離線操作,時間靠前的詢問可能統計到時間靠後的詢問(因為深度和時間加起來計算了),所以需要再加乙個時間維。
這樣就是三維偏序問題,用cdq分治解決,複雜度\(o(n log^2n)\)。
題意:給定n個點的競賽圖,m條已知的點不相交簡單路徑,其餘邊方向隨機,求形成強連通分量個數的期望。
演算法:題意:給定n個點m條邊的無向圖,第i個點有權值ai,邊(x,y)的權值定義為:
\[w(x,y)=\sum_^\sum_^[(i,j)=1]i+j
\]可以選擇乙個數字p,使得所有邊的權值都減少p(至多減到0),給出限定值t,求最小的p滿足1~n的最短路<=t。
n,m<=20000,ai<=105,t<=1018。
演算法:莫比烏斯反演+二分最短路
題解:對於兩點權值為a,b的邊權w:
\[w=\sum_^\sum_^[(i,j)=1]i+j
\]莫比烏斯反演易得:
\[w=\sum_^}\mu(d)*d\sum_^}\sum_^}i+j
\]後面部分直接計算:
\[sum(a,b)=a*\frac+b*\frac
\]複雜度\(o(m \sqrt)\)。
預處理所有邊權,二分p計算最短路判斷即可。最短路陣列記得初始化為比1e18大的數字。
題意:給定n個點的樹,定義f(s)為點集s的匯出子圖的邊數,求\(\sum_f(s)^k\)。n<=10^5,k<=10。
題意:給定n個二元組(xi,yi),兩個二元組i和j的價值定義為\(|x_i-x_j|*max\\),乙個區間[l,r]的價值是其中任選兩個二元組的最大價值。
給定m個操作,修改乙個二元組的x或y,詢問乙個區間的價值。
n,m<=10^5。
資料保證初始的y和修改的y隨機生成。
題意:給定n個點的無向圖鄰接正邊權矩陣。每個點可能正在維修(不可經過)。k次操作,詢問點x出發回到x的最短路徑,或改變乙個點的維修狀態。n,k<=400。
演算法:dijkstra
題解:t4也出走路題,想不到吧!
從點x出發回到x的最短路徑就是最短簡單環。
每次詢問將點x刪除後將與點x有直接連邊的點標記為關鍵點,那麼就是求解關鍵點兩點間最短路的最小值。(與x的連邊邊權只要在最短路初始值設定的時候修改即可)
解決這個問題,將關鍵點作為起點集進行dijkstra,訪問到乙個點的最短路(第一次訪問)和次短路(第二次訪問)加起來就是這個點對答案的貢獻,取最小值就是答案。
修改操作是假的。
題意:給定n個人的三元組(ai,bi,ci),乙個人能打敗另乙個人當且僅當至少有兩個屬性大於另乙個人,資料保證沒有兩個人的同乙個屬性相同。
共進行n-1輪遊戲,每輪任選兩個人淘汰敗者,求哪些人可能成為最後留下的人。n<=10^5。
演算法:主席樹+tarjan縮點。
題解:樸素做法是暴力求出兩兩有向邊的方向,然後對競賽圖縮點後有一條哈密頓路徑,唯一那個入度為0的強連通分量包含的點數就是答案。
證明比較顯然,①有入度的強連通分量一定不可能淘汰掉入度到它的強連通分量,②入度為0的強連通分量一定有哈密頓迴路(競賽圖的性質),故讓其中某個點x留到最後只需要從它上乙個點開始往前一直兩兩淘汰,最終就會剩下x的下乙個點。
現在的問題是邊數太多了,但有很多冗餘邊。假設只有a,b,那麼所有店按a排序後以b為下標建主席樹(可持久化權值線段樹),每次父親向兒子連邊以及新鏈葉子向依賴鏈葉子連邊,然後每次的點向直接引用依賴鏈的左子樹連邊,這樣建圖後連通關係就完全等價於上面的建圖了。建三棵主席樹ab,ac,bc連邊即可。
複雜度o(n log n)。
題意:給定n個點構成的完全二叉樹,即點n的父親是點\(\frac\),邊權為\(an^2+bn+c\),其中a,b,c為給定的常數。有m次刪除以某個點x為根的子樹(可能重複刪除),每次刪除後要求找乙個點x,滿足所有點到它的距離和最短,求點x和距離和。n,m<=105,a,b,c<=109。
題意:給定v個點e條邊的無向圖,有乙個長度為n的小寫字母串,有m只猴子各自攜帶乙個子串要從1到v,兩隻猴子的路徑如果有邊相交那麼會發生強度為兩個子串的lcp的叫囂。要求安排所有猴子的路徑使得所有叫囂的最小值最大。v,e<=10000,n,m<=10^5,保證80%的邊直接從1到v。
演算法:最大流+二分雜湊
題解:首先如果知道有k條邊不相交的路徑可以從1到v,那麼二分叫囂值l,如果兩個子串的lcp>=l那麼它們可以在同一條路徑上,而且lcp>=l的性質有傳遞性,所以直接用桶記錄每個子串長度為l的字首就可以知道至少需要多少條路徑,判斷是否》k即可。
如何知道從1到v有多少條邊不相交的路徑?將所有邊轉化為流量為1的邊,跑最大流就是答案。
題意:對乙個黑白格圖進行大模擬得到一棵帶點權樹,求樹的直徑(點權和)長度為x,然後要求將x劃分成若干個整數的方案數之和。n<=10^5。
複雜度\(o(n \sqrt n)\)。
GDOI2018模擬7 8 質數
將1 n分成盡可能小的集合,使得每個集合的元素均為質數 乙個數n n 6000 第一行乙個數m表示分成幾塊 第二行n個1 m的數表示每個數分到哪一塊 2 1 2 2 1 1 1 1 2 這題很有趣 我們知道有個哥德 猜想 任意乙個足夠大的偶數可以分成兩個質數的和 由於目前人類沒有證明出它是錯的,而且...
GDOI2018模擬8 11 決戰
聽說暴力狀壓可以過?然而我常數不好只有90分 考慮普通的狀壓,f i s j 表示當前填到第i行,第i行的狀態為s,用了j個哲學 家的方案數 我們把最後一維看做多項式,用x j的係數表示答案 咦?模數是998244353哦,那我們是不是可以用ntt加速呢?如果我們求出對於所有wi 答案的多項式的點值...
遲到的GDOI2018總結
gdoi2018總結 大的總結 這次比賽時間安排得很緊很緊,考完gdoi馬上又有期中考,第一次考 gd 開頭的比賽,有點緊張,怕考不好。然後把比賽策略似乎都給拋在了腦後,只想著一點 盡量拿部分分。又想做題切一題,又想打滿暴力,有點混亂。所以在之後的比賽中,策略是真的亂,而且還有點緊張,導致做了很多錯...