Codeforces 768G The Winds of Winter
有一棵個點的有根樹,在刪掉一個點後得到一個森林,現在可以把某個點的父親換爲另一個點,使得節點數最大的子樹的大小最小。要求對每個點求刪掉該點後的答案。
設表示子樹大小,用主席樹維護一下每個點子樹中的和它到根路徑上的,每次一定是把刪掉該點後最大的樹的某棵子樹接到最小的樹上,於是直接在主席樹上查詢即可。
時間複雜度
hdu 6312 Game
有一個集合,兩個人輪流操作,每次可以選走集合中的一個數和它的所有約數,問先手是否必勝。
結論是先手必勝。若局面是先手必勝,則先手可用同樣的方式獲勝,反之則先手第一步取,同樣是先手必勝。
時間複雜度
luogu 2791 幼兒園籃球題
有個球,其中有個藍球,個紅球。現在從中選個球,選中個藍球的代價爲,問期望代價。
答案爲
預處理斯特林數即可。
hdu 6314 Matrix
求有多少個的矩陣滿足至少有行列全是。
若只考慮行的情況,設容斥係數爲,則
且可以得到
可以遞推出,列的容斥係數同理,然後對兩維分別容斥即可。
Codeforces 786E ALT
給定個節點的樹,有個點對。現在要給若干條邊和點對分配狗,對於個點對需要滿足要麼路徑有狗,要麼樹上到路徑上的每條邊都有狗,問最少需要多少條狗。
用樹剖線段樹優化建圖然後跑最小割即可。
Codeforces 1208G Polygons
在點數在到之間且擁有同一個外接圓的正多邊形中選出個,使得在經過任意旋轉後圓上的點數儘可能少。
存在一種最優方案使得選出來的所有多邊形全都經過同一個點,否則可以通過旋轉使其滿足。顯然若選了點數爲的多邊形,則點數爲的約數的多邊形必然已被選擇,且此時新增加的點數爲。所以只要把到的歐拉函數排序後取前大就好了。
Codeforces 1217F Forced Online Queries Problem
有個點,每次加入或刪除一條無向邊,或詢問兩點的連通性,強制在線。
假的強制在線,因爲只有或,所以每次把一條邊拆成兩條,欽定這兩條邊都要修改,然後做線段樹分治。每次處理完一個答案後,把本次詢問和下一次詢問之間不需要被加入的邊的對應標記翻轉即可。
LibreOJ 575 不等關係
給一個由或組成的長度爲的字符串,統計有多少個長度爲的排列滿足當且僅當。
如果不考慮的限制,那麼合法方案數等價於把到劃分成若干個上升序列的方案數。對的限制進行容斥,設表示前個位置中填入若干個上升序列的方案數除以,表示前個字符中有多少個,則
分治FFT即可。
Codeforces 1209E2 Rotate Columns
給出行列的矩陣,可以對每一列進行任意次旋轉操作,設表示第行的最大數,要求最大化
問題可以轉化成可以對每一列進行任意次旋轉操作,並從每一行中選出一個元素,使得選出元素的和儘量大。不難發現只有最大值最大的前列是有用的。然後就可以狀壓dp,設表示前列且已在的行中選了數時的答案。
時間複雜度
Codeforces 1209F Koala and Notebook
給一個個點條邊的無向圖,定義一條路徑的權值爲經過的每條邊的標號按順序連接起來組成的數字。求從出發到每個點的最短路。
跑最短路的時候,對每個點記錄到達該點路徑的最小權值在Trie上的對應位置,每次鬆弛的時候把邊上的數字加入Trie即可。
Codeforces 1215F Radio Stations
有一個個點的圖,每個點有一個對應區間,要求選出一個參數和若干個點,滿足如果一個點被選,則被其區間包含。且會給定若干條紅邊和藍邊,要求紅邊兩個端點至少有一個被選,藍邊兩個端點至少有一個沒被選,要求構造一組合法解。
如果沒有的限制,顯然這是個2-sat問題。加入限制後,可以對的每個取值拆成兩個點,分別表示不大於和大於,於是又變回了2-sat問題。
Codeforces 1192B Dynamic Diameter
給一棵樹,邊有邊權,要求支持修改邊權和詢問直徑,強制在線。
算是比較經典的題了吧,樹剖,LCT,點分樹都能做。有一種比較巧妙的做法,就是先求出這棵樹的全dfs序,也就是每次到達一個點就將其加入序列末端,最後得到一個長度爲的序列。設點到根的距離爲,在序列中第一次出現位置爲,則的距離爲
也就是說樹的直徑就是
修改邊權就相當於區間加,用線段樹維護對應信息即可。
Codeforces 1221E Game With String
有一個長度爲的序列,先手每次可以將連續個變成,後手可以將連續個變成,不能操作者輸,問先手是否必勝。
注意到,那麼如果當前存在一段長度在之間的,顯然後手必勝,故只需要判斷先手第一步操作後後手能否取得這樣一個局面即可。
Codeforces 1221G Graph And Numbers
有一個個點條邊的無向圖,每個點的權值可以取或,每條邊的權值爲兩端點的權值和,問有多少種方案滿足權值爲的邊均至少存在一條。
容斥一下,發現比較難求的就只有不能出現權值爲的邊的情況。用meet in the middle,然後預處理可行的情況並處理出高維前綴和,就可以統計答案了。
Codeforces 1076G Array Game
有一個數組,當前指針位於並讓減,兩個人輪流操作,設當前位置爲,每次可以選擇一個且滿足,把指針移到處並把減去。不能操作者輸。有一個數組,要求維護區間加,並詢問對一個區間進行遊戲時先手是否必勝。
注意到遊戲結果只跟元素的奇偶性有關。考慮倒着染色,先把儘量長的偶數段染爲顏色,再把接下來的個元素染成顏色,不斷重複操作。那麼先手獲勝當且僅當的顏色爲。用線段樹維護矩陣並支持區間翻轉即可。
Codeforces 1229D Wojtek and Card Tricks
給個到的置換,對於每個區間求通過區間內的置換可以得到多少個不同的置換。
把每個置換看成一個點,預處理出置換間的轉移。枚舉右端點,那麼就只用考慮所有第一次出現的置換。維護當前能得到的置換集合,若某個新加入的置換還沒被得到,就暴力更新答案。注意到一個置換羣的子羣大小必然是他的約數,所以每次加入新置換後得到的置換集合大小至少增大一倍,所以總的時間複雜度爲
LibreOJ 6270 數據結構板子題
給出個區間,每次詢問有多少個區間被給定區間包含且長度不小於。
可以發現在所有區間長度在和詢問區間長度之間時,答案就等於總區間數減去有一個端點不在詢問區間內的區間數。考慮用差分來統計,然後把區間按長度從小到大插入,用樹狀數組維護即可。
AcWing 109 天才ACM
定義一個序列的價值爲在序列中選出最多對數,每個數只能被選一次,每對數的差的平方和的最大值。給一個長度爲的序列,問最少能將序列分成幾段,使得每一段的價值均不超過。
顯然用二分或正常的倍增求右端點或會超時。這題的做法是先從小到大倍增,再從大到小倍增,具體來說就是跳的步數爲。若跳到步時不能繼續跳,則嘗試着跳步。每次跳的時候,先將新加入的數排序,然後與之前已經加入的數歸併排序,不難證明這樣做的時間複雜度爲。
Codeforces 1251F Red-White Fence
給兩個長度分別爲的數組,現在要從中選出任意個數,中選出恰好一個數組成序列,滿足每次詢問給出,問有多少個合法的序列滿足
枚舉中選哪個數,如果一個數在中出現一次,則爲,出現次數大於則爲,用二項式定理求出每個同類項的係數,然後FFT一下就好。
Codeforces gym102268D Dates
有個女孩和天,第天可以約會個女孩,每個女孩可以約會的時間爲,問最多可以約會多少個女孩。
考慮按左端點從小到大的順序貪心,顯然最優的方案是每次選取儘量靠左的位置放,若不能放,則考慮替換掉前面權值儘可能小的一個,且替換掉該元素之後,位於該元素後面的元素的位置都會往前移。用一個隊列維護可以被當前位置替換的元素,顯然每個元素能往前移的步數是有限制的,用線段樹維護隊列中每個元素還能往前移多少步即可。
Codeforces 1253F Cheap Robot
給一個個點條邊的無向圖,邊有邊權,其中前個點爲關鍵點。有次詢問,每次詢問會給出兩個關鍵點,求一個最小的閾值,滿足從一個關鍵點走到另一個關鍵點的路徑長度不能超過的條件下這兩個關鍵點連通。
如果把關鍵點之間的邊權看作最短路,那麼只要求出關鍵點之間的最小生成樹即可。先跑最短路求出與每個點距離最近的關鍵點是誰,然後枚舉每條邊,強制這條邊一定要被經過,從而得到一條新邊。對構成的新圖求最小生成樹即可。
Codeforces 1254E Send Tree to Charlie
給一棵個節點的樹,把所有邊按照某種順序排列後,依次交換每條邊兩端節點上的數,從而得到一種方案。現在固定一些節點上的數,問有多少種可能方案。
和CSP的d1t3長得很像。先考慮全部位置都是的情況,採用增量法,每加入一個葉節點,則它造成的影響只取決於新邊在使用的哪條出邊後被使用,相當於把答案乘上。因此最終答案就是.
對於某些位置固定的限制,設經過的路徑爲,則帶來的限制爲必然是的所有出邊中第一個被使用的;對於,使用後下一個使用的一定是;一定是的所有出邊中最後一個被使用的。注意到所有路徑的長度和一定不會超過,因此每次交換會使這個值增加。
於是可以對每個點分別計算,設在這個點上的限制會構成條鏈,那麼答案就乘以.
Codeforces 1264D2 Beautiful Bracket Sequence
定義一個合法括號序的深度爲,的深度是的深度,的深度是深度的較大值,其中均爲合法括號序。一個括號序的深度爲去掉任意個字符後得到的合法括號序深度的最大值。
給出一個括號序,其中有若干個位置可以任意填,求所有方案的深度之和。
小清新計數題。對於一個括號序,若它深度爲,則一定能通過刪除操作將其變成個左括號加個右括號的形式。也就是說每個位置左邊左括號數量(即爲)和右邊右括號數量(記爲)的較大值(記爲)的最大值即爲括號序的深度。
又可以發現一個括號序中恰有一個位置滿足,則只需要在這樣的位置進行計數。
枚舉每個位置,然後考慮這個位置的貢獻。係數爲左括號數量,可以看成每個左括號的貢獻是.
對該位置左邊的每個左括號,以及強制把變成左括號統計貢獻,用組合數計算合法方案數即可。
Codeforces 1285F Classcal?
給出長度爲的數組,求.
考慮枚舉,問題變爲對一個集合,求滿足的所有數對中的最大值。
從大到小枚舉集合中的元素,維護一個棧。對於當前元素,若存在一個非棧頂元素與它互質,則不停退棧。而棧中與元素互質的元素個數等於
其中表示棧中有多少個元素是的倍數。只需在入棧出棧的同時維護即可。
時間複雜度.
Atcoder Dwango Programming Contest 6th E - Span Covering
將個長度給定的左閉右開區間放置在中,端點必須是整數,問有多少种放置方式使得中的每個點都至少被一個區間覆蓋。
考慮按長度從大到小放置區間,並把交集非空的區間合併,得到一系列不相交的區間,設長度分別爲且滿足,則新加入一個長度爲的區間時有以下幾種情況:
1、得到一個長度爲的新區間。
2、與某一個區間合併。不妨設與第個區間合併,若不增加區間長度,則有種方案,否則對於任意,有種方案使得區間增加長度。
3、合併兩個區間。不妨合併區間,則對於任意,有種方案使得合併後的區間長度爲.
不難發現dp的時候只需要維護和即可完成轉移,時間複雜度爲.
Codeforces 1288F Red-Blue Graph
一個左邊有個點,右邊有個點的二分圖,每條邊可以被染成紅色或藍色,花費分別爲,也可以不染色。每個點要麼沒有限制,要麼與它相連的紅邊數量要嚴格大於藍邊數量(紅點),要麼藍邊數量要嚴格大於紅邊數量(藍點)。問最小花費是多少。
考慮網絡流。令每條雙向邊的流量爲,若從左邊流到右邊表示染成紅色,右邊流到左邊表示染成藍色,否則不染色。對於左邊的紅點,必須滿足入流大於出流,從向其連一條下界爲無上界的邊,藍點和無色點類似。然後通過把一條邊拆成兩條轉成費用流即可。
Codeforces 1295F Good Contest
給出個區間,在每個區間內等概率選一個數,問最終得到的序列單調不升的概率。
離散化後設表示前個區間,在第個值域區間內有個數的概率,用前綴和優化轉移即可。
洛谷P6061 [加油武漢]疫情調查
給一個個點條邊的有向圖,要求用若干個環覆蓋所有點。一個環的代價爲經過的邊權值之和,若一個點沒有被覆蓋,則要付出的代價。問最小代價。
由於一個點可以被多個環覆蓋,先做傳遞閉包,然後把自己連向自己的邊權設爲,用km跑最小權匹配就好。
洛谷P6060 [加油武漢]傳染病研究
設表示的約束個數,給出,求
設的質因數分解爲,則。若把看作未知數,則展開後得到一個關於的多項式,且次數不超過。於是線性篩求出每個數對應的多項式,然後對係數求前綴和,就可以詢問了。
洛谷P6156 簡單題
給出,求
定義爲:若有平方因子則,否則。
推一波式子求出來答案是
和後面的迪利克雷卷積都可以用線性篩來求,時間複雜度。