對原圖跑費用流,設每次增廣後的當前的流量總和和費用總和分別爲 \(v_i,c_i\),分類討論便可獲得每次詢問的答案爲 \(\min\left\{ \frac{c_i+x}{v_i} \right\}\)。html
選一個點做爲匯點,每一個點都有初始流量 \(1\),流量都向匯點流,那麼每一個點流出的流量都比流入的流量大 \(1\),因而一個環內的點的個數就是流出環的流量減去流入環的流量。以匯點爲根找一棵生成樹,每一個點向父親的流量就是該點的子樹大小,提早對每一個點的出邊進行極角排序,預處理前綴和後便可快速查詢。閉包
都是有源匯上下界最小費用可行流。優化
CF708D Incorrect Flow CF1288F Red-Blue Graph編碼
線段樹優化建圖跑費用流,掃描線的過程當中動態更新線段樹上的圖。spa
開 \(2m\) 棵線段樹優化建圖跑費用流,\(m\) 棵表示從左來,\(m\) 棵表示從右來,線段樹上向兒子連邊時處理跨過中點的費用。指針
[THUSCH2017] 換桌rest
離線後對詢問按 \(r\) 排序,線性基中的每一位保留出現最晚的元素,在線性基上查詢時,當 \(l\) 比一個元素出現時間早時,才能考慮該元素的貢獻。
CF1100F Ivan and Burgers 二維狀況:【NFLSPC #3】芳
設二元組 \((a,b)\),表示有至少 \(a\) 的血量時,能夠加 \(b\) 的血量,用可並堆維護,注意當前節點的優先級最高,要與堆頂元素不斷合併來更新。
線段樹維護出棧序,內層再套李超線段樹支持斜率優化,時間複雜度爲 \(O(n\log^2n)\),空間複雜度爲 \(O(n\log n)\)。也能夠直接用樹狀數組套可撤銷李超線段樹,但空間複雜度爲 \(O(n \log^2 n)\)。
對詢問分塊,每塊先遍歷一遍整棵樹獲得以前操做後的答案,並將該塊要修改的點拿出來建虛樹。虛樹上的點維護到虛樹父親之間點的 \(t_i-siz_i\),\(siz_i\) 表示 \(i\) 子樹內黑點個數,每次在虛樹往上跳,打標記來修改,二分獲得有多少個點知足 \(t_i<siz_i+tag\)。複雜度爲 \(O(n\sqrt n \log n)\)。
\(LCP\) 就是後綴樹上 \(LCA\) 的長度,在後綴樹上用 \(01\ Trie\) 啓發式合併便可。
發現 \(\sum|w|=qk\),考慮根號分治。當 \(k\) 比較小時,能夠 \(O(k^2)\) 去枚舉子串,在 \(s\) 的 \(SAM\) 上的對應節點計算每一個子串的貢獻。當 \(k\) 比較大時,能夠將 \(s\) 和全部 \(w\) 一塊兒建成廣義 \(SAM\),倍增找的對應的節點來依次回答每一個詢問。
詢問就是區間前綴兩兩 \(LCA\) 在 \(Parent\) 樹上的深度最大值。離線詢問後固定右端點,用 \(LCT\) 維護 \(Parent\) 樹,\(access\) 染色來更新每一個前綴位置配對的 \(LCA\) 深度最大值,用樹狀數組維護後綴最大值便可。
由於是實數,因此不考慮區間端點重合的狀況。發現線段會被 \(2n\) 個端點劃分爲 \(2n+1\) 段,每段指望長度爲 \(\frac{l}{2n+1}\)。考慮每段的貢獻,設 \(f_{i,j}\) 表示已經考慮了 \(i\) 個端點,有 \(j\) 個左端點未匹配的方案數,得答案爲合法區間的方案數除以總方案再乘上每一個區間的貢獻:
也能夠考慮用積分來推式子,答案爲:
CF1153F Serval and Bonus Problem
發現一個點的獨特的城市必定在其所在的最長鏈上,所以找到樹的直徑,從直徑端點開始 \(dfs\),用棧維護當前點的獨特的城市,先用預處理的次長鏈更新棧,而後進入最長鏈所在的兒子,再用最長鏈更新棧,獲得當前點的答案,最後進入其餘兒子。直徑兩個端點獲得的答案取較大值爲一個點的答案。
\(T_1\) 的一條邊 \((x,y)\) 能和 \(T_2\) 的一條邊 \((u,v)\) 匹配的前提條件是路徑 \((u,v)\) 在 \(T_1\) 上包含邊 \((x,y)\)。根據霍爾定理能夠發現必定存在完美匹配,由於任意取 \(T_1\) 的 \(k\) 條邊去掉後,會造成 \(k+1\) 個連通塊,得 \(T_2\) 上至少有 \(k\) 條邊能匹配。在 \(T_2\) 上剝葉子,在 \(T_1\) 上用並查集和倍增找對應的邊匹配便可。
CF1284F New Year and Social Network
貪心就是儘量讓前面的段長。先將詢問離線,按要求的極差從小到大排序。設 \(nxt_i\) 表示 \(i\) 在當前極差下所在段的下一個位置,將其看做連邊,用 \(LCT\) 維護,詢問就是到根的點數。但 \(nxt_i\) 變化次數是 \(O(n)\) 的,直接作複雜度爲 \(O(n^2\log n)\)。考慮根號分治,只在 \(LCT\) 上連 \(nxt_i \leqslant \sqrt n\) 的邊,剩下的用二分和 \(ST\) 表去跳。複雜度爲 \(O(n\sqrt n\log n)\)。
CF1039E Summer Oenothera Exhibition
用分塊維護度數根號分治,複雜度爲 \(O(n\sqrt n)\)。也有 \(O(n\log^2n)\) 的作法,每次只給重子樹和子樹外加權值和自身打標記,查詢時跳重鏈來加上輕子樹的貢獻。
用 \(LCT\) 維護,維護子樹大小 \(siz_x\),虛子樹大小(包括自身)\(s_x\),虛子樹大小平方 \(s2_x\),子樹內點的答案和 \(ans_x\),虛子樹內點的答案和 \(val_x\),子樹內 \(a_x \times s_x\) 的和 \(sum_x\),得:\(ans_x=ans_{ls}+ans_{rs}+val_x+a_x\times(s_x\times s_x-s2_x)+2\times a_x \times siz_{rs} \times s_x+2 \times sum_{ls} \times (siz_x-siz_{ls})\)。由於 \(splay\) 左子樹中是祖先節點,所以就有了最後一項來算祖先的貢獻。
先排序,得答案爲 \(\sum\limits_{i=1}^n\sum\limits_{j=i+1}^np_ip_j2^{i-j-1}\),考慮兩兩之間的貢獻,用權值線段樹便可維護。
最優狀況必定存在一個點在全部多邊形上,否則能夠旋轉。當存在正 \(x\) 邊形時,全部知足 \(y\mid x\) 的正 \(y\) 邊形必定存在,所以加入一個正 \(x\) 邊形的貢獻爲 \(\varphi(x)\),取 \(3\) 到 \(n\) 的前 \(k\) 小歐拉函數便可。注意特判。
每一個位置向其做爲右端點的合法的括號序列的最小左端點的上一個位置連邊,最小左端點即爲用棧維護後右括號匹配到的左括號,其會造成若干條鏈。在 \(SAM\) 上動態加字符,得以 \(i\) 爲結尾的合法後綴左端點 \(\leqslant i-len_{fa_{las}}\) 時纔會有貢獻,在鏈上倍增便可。
先樹上差分,轉化爲求到根路徑上的點集和定點的距離和。設 \(x\) 到根路徑上的點集爲 \(p_i\),定點爲 \(k\),點到根的邊權和爲 \(dis_x\),所求即爲:\(\sum dis_{p_i}+dis_{k}\times dep_x-\sum dis_{lca(p_i,k)}\)。只有最後一項很差求,發現其能夠用 [LNOI2014] LCA 中的方法求出,可持久化線段樹維護便可,區間加用標記永久化實現。
建出圓方樹,設圓點權值爲 \(1\),方點權值爲 \(0\),所求即爲點集造成的最小連通塊的權值和減去點集大小。
設解異或方程組後自由元個數爲 \(cnt\),答案即爲 \(2^{cnt}\)。當圖合法時,即每一個連通塊黑點個數爲偶數時,得其答案爲 \(2^{m-n+p}\),其中 \(p\) 爲連通塊個數,考慮對每一個連通塊取生成樹,對於非樹邊的任意一個方案,樹邊都有惟一一個合法方案與之對應。嚴謹的說就是矩陣的秩爲 \(n-p\),所以自由元個數爲 \(m-n+p\)。用圓方樹維護後解決屢次詢問。
離線詢問固定右端點,在 \(Parent\) 樹上維護每一個子串上一次的出現位置,發現須要像 \(access\) 同樣對當前節點到根的節點進行染色,像 [雅禮集訓 2017 Day7] 事情的類似度 同樣作便可,須要區間取 \(\max\)、區間和公差爲一的等差數列取 \(\max\) 和單點查詢,用兩棵線段樹來維護。
對每一個串建出 \(SAM\),當一個 \(SAM\) 上的節點沒有 \(c\) 的轉移時,就將其連向下一個 \(SAM\) 起始節點 \(c\) 的轉移指向的點。在這樣造成的 \(DAG\) 上統計路徑條數即爲答案。
將 \(b_i\) 從小到大排序,發現對於每一個 \(a_i\) 能匹配的 \(b_i\) 都是一段後綴。對每一個位置維護 \(c_i-i\),\(c_i\) 表示 \(b_i\) 能和當前多少個 \(a_i\) 匹配。線段樹區間加,維護最小值,用霍爾定理斷定便可,有完美匹配當且僅當最小值 \(\geqslant 0\)。
源點 \(\rightarrow\) 列連通塊 \(\rightarrow\) 點 \(\rightarrow\) 行連通塊 \(\rightarrow\) 匯點。跑費用流,拆邊處理費用,即 \(\binom{i+1}{2}-\binom{i}{2}=i\)
對於每一個右端點求出左端點的答案,在可持久化線段樹上回答便可。考慮新加入一個右端點的貢獻,一個位置的全部迴文後綴能夠劃分爲 \(O(\log n)\) 個等差數列,對每一個等差數列一塊兒處理便可,發現其貢獻剛好爲區間加 \(1\)。在 \(PAM\) 查詢子樹最大值便可獲得一個串上一次的出現位置,用線段樹維護便可。
先用折半搜索求出有用的蘋果個數爲 \(i\) 的合法方案數 \(s_i\),發現求出剛好有 \(i\) 個有用的蘋果的生成樹個數 \(f_i\) 後,\(\sum f_is_i\) 即爲答案。設 \(g_i\) 爲欽定有 \(i\) 個有用的蘋果的生成樹個數,其能夠用矩陣樹定理來求,連邊方式爲:有用 \(\longleftrightarrow\) 有用,有用 \(\longleftrightarrow\) 壞,沒用 \(\longleftrightarrow\) 壞,壞 \(\longleftrightarrow\) 壞,得 \(g_i=\sum\limits_{j\leqslant i}\binom{i}{j}f_j\),二項式反演便可。
每次將當前點集按最高位是 \(0\) 是 \(1\) 劃分爲兩個點集,兩個點集遞歸處理後在兩個點集間選一條權值最小的邊相連,不難發現這樣獲得的樹就是最小生成樹。整個過程能夠用 \(01\ Trie\) 來實現,找最小邊就是在 \(01\ Trie\) 上貪心。到葉子節點時,若其有 \(n\) 個點,其方案數爲徹底圖生成樹個數 \(n^{n-2}\)。複雜度爲 \(O(n\log^2 n)\)。
建出 \(dfs\) 樹,按通過的方向給每條邊定向,得非樹邊只有返祖邊。設 \(S=\left\lceil \sqrt n \right\rceil\),當某條非樹邊 \((x,y)\) 知足 \(dep_x-dep_y \geqslant S-1\) 時就找到一個大小至少爲 \(S\) 的環了。不存在這樣非樹邊時,對每一個點按 \(dep_x \bmod S-1\) 的值分類,由於非樹邊都知足 \(dep_x-dep_y < S-1\),所以每一類點都是獨立集,由抽屜原理得必定存在一類點個數 \(\geqslant \left\lceil \frac{n}{S-1} \right\rceil \geqslant S\)。
\(01\ Trie\) 和前綴優化建圖,跑 \(2-SAT\)。
對每一個人在每一個時刻的生死狀態和互相限制用 \(2-SAT\) 來建圖。但直接建圖點數是 \(O(nT)\) 的,發現和限制無關的點是在一段鏈上,因而能夠將這樣的點縮起來處理,這樣點數就是 \(O(n+m)\) 的了。\(n-1\) 減去每一個點最終的生存狀態能到達多少個其餘點最終的死亡狀態就是該點的答案,用 \(bitset\) 來優化傳遞閉包。建反圖分批處理來優化空間。
設 \(d_x\) 表示 \(1\) 到 \(x\) 的最短距離,對於任何一張連通圖都有:\(d_x \in [0,n),d_1=0\),若存在邊 \((x,y)\),則有 \(|d_x-d_y|\leqslant 1\)。能夠發現這是 \(d_x\) 合法的充要條件,已知知足上述限制的 \(d_x\) 時能夠按 \(d_x\) 從小到大來依次加點構造出其對應的圖。因而問題就轉化爲了構造知足以上限制的 \(d_x\),使其費用最小。像 [HNOI2013] 切糕 同樣建圖跑最小割便可。
構造 \(g(n)\) 知足 \(f(n)=\prod\limits_{d\mid n}g(d)\),莫比烏斯反演得 \(g(n)=\prod\limits_{d\mid n}f(d)^{\mu\left(\frac{n}{d}\right)}\),考慮對 \(\text{lcm}\) 進行 \(\text{min-max}\) 容斥來轉化爲 \(\gcd\):
考慮最後的指數,設 \(S\) 中能被 \(d\) 整除的有 \(t\) 個數,得:
所以有:
先拆位,而後用差分算出每一個位置是否必須爲 \(1\)。設 \(f_i\) 表示前 \(i\) 個位置合法,且第 \(i\) 個位置爲 \(0\) 的方案數,合法的轉移位置具備單調性,複雜度爲 \(O(kn)\)。
平方的含義就是對於一種操做方式來講有多少種操做方式和其結果同樣。能夠 \(DP\) 求出有多少種操做方式能獲得給定的結果,設 \(f_{i,j}\) 爲取了 \(i\) 次,取了上管道 \(j\) 次便可。對於原問題,考慮 \(DP\) 套 \(DP\),設 \(g_{i,j,k}\) 表示取了 \(i\) 次,給定結果的那個操做方式已經取了上管道 \(j\) 次對應的全部 \(f_{i,k}\) 的和,枚舉每次取上管道仍是下管道轉移便可。
出現三次的順子看做三個刻子,所以順子出現次數只能爲 \(0,1,2\)。設 \(f_{i,j,k}\) 表示考慮了前 \(i\) 種牌,\(i-1\) 開始有 \(j\) 個順子待匹配,\(i\) 開始有 \(k\) 個順子待匹配的方案數,用矩陣快速冪轉移便可,特殊處理有初始牌的位置。其實也是 \(DP\) 套 \(DP\),內層 \(DP\) 是可行性。
只要算出在 \(i\) 左側和右側同時出現的子串個數就能計算位置 \(i\) 的答案。在 \(SAM\) 上每一個節點維護出 \(\text{endpos}\) 集合的最小值 \(L_x\) 和最大值 \(R_x\),設 \(l=\min(R_x-L_x,len_{x})\),得該節點的貢獻爲:\([L_x+1,R_x-len_{fa}]\) 加上 \(l-len_{fa}\),\([R_x-l+1,R_x-len_{fa}]\) 加上首項爲 \(-1\),公差爲 \(-1\) 的等差數列,差分維護就能作到線性。
求出 \([1,i]\) 的答案 \(f_i\),\([i,n]\) 的答案 \(g_i\),必須選 \(i\) 的答案 \(h_i\) 後就能快速回答詢問了。用斜率優化就能求出 \(f_i,g_i\)。暴力求 \(h_i\) 的作法就是枚舉 \(l\leqslant i \leqslant r\),用 \([l,r]\) 的貢獻加上 \(f_{l-1}+g_{r+1}\) 來更新 \(h_i\)。考慮分治,對於分治區間 \([L,R]\),只維護出 \([L,mid]\) 的凸包,去更新 \([mid+1,R]\) 的值,這樣就保證了 \(l\in[L,mid],r\in[mid+1,R]\),同理還需維護出 \([mid+1,R]\) 的凸包,去更新 \([L,mid]\) 的值。
[ARC066D] Contest with Drinks Hard
建線段樹,葉子節點權值爲根節點到其的距離,非葉子節點權值爲正無窮。詢問離線,\(dfs\) 時在線段樹上加減對應的權值來實現換根。
設 \(a_{l,r}\) 爲兩個端點都在區間 \([l,r]\) 內的合法路徑數,\(b_{l,r}\) 爲兩個端點都不在區間 \([l,r]\) 內的合法路徑數,\(cnt_i\) 爲以 \(i\) 爲其中一個端點的合法路徑數,不可貴 \(2(a_{l,r}-b_{l,r})=\sum\limits_{i\in [l,r]}cnt_i -\sum\limits_{i\not\in [l,r]}cnt_i\),所以知足 \(\sum\limits_{i\in [l,r]}cnt_i -\sum\limits_{i\not\in [l,r]}cnt_i>0\) 的區間就是合法的。點分治求出 \(cnt_i\) 後雙指針統計便可。
枚舉每種邊權 \(w\),\(\leqslant w\) 的邊權值改成 \(0\),\(>w\) 的邊權值減去 \(w\),新圖的最短路加上 \(kw\) 看做這種邊權的權值,每種邊權的權值取 \(\min\) 即爲答案。考慮到不符合要求的狀況必定劣,所以其不會被統計到。由於路徑邊數可能 \(<k\),因此還要把 \(0\) 加到枚舉的邊權裏。
[NEERC2017] Journey from Petersburg to Moscow
直接對每一個深度進行 \(Trie\) 樹合併統計答案便可,複雜度證實類比 \(dsu\ on\ tree\),其餘兒子合併到重兒子上,複雜度爲輕兒子子樹大小和 \(O(n\log n)\)。
可持久化 \(01\ Trie\) 維護來回答詢問,異或直接全局打標記便可。剩下的只有 \(and\ 0\) 和 \(or\ 1\) 有用,發現執行這樣的操做後同層節點都只會有一個兒子,另外一個兒子會合並過來,所以每次重構後,對於該層的操做打標記便可。重構次數只有 \(O(\log n)\) 次,因此複雜度有保證。
設全部數的異或和爲 \(s\),若 \(s\) 的某一位爲 \(0\),則 \(x_1,x_2\) 這一位要麼都是 \(0\),要麼都是 \(1\),由於要總和最大,因此要儘量選 \(1\),等價讓 \(x_2\) 這一位儘量爲 \(1\)。若 \(s\) 的某一位爲 \(1\),則 \(x_1,x_2\) 這一位一個爲 \(0\),一個爲 \(1\),由於要 \(x_1\) 儘可能小,等價讓 \(x_2\) 這一位儘量爲 \(1\)。總的策略是讓 \(x_2\) 先在 \(s\) 爲 \(0\) 的位儘量爲 \(1\),再在 \(s\) 爲 \(1\) 的位儘量爲 \(1\)。用線性基來實現,插入和查詢時先考慮 \(s\) 爲 \(0\) 的位便可。
[2017 山東一輪集訓 Day1 / SDWC2018 Day1] Set
暴力 \(DP\) 就是設 \(f_{i,j,k}\) 爲當前考慮到第 \(i\) 位,模 \(p\) 爲 \(j\),數位和爲 \(k\) 的方案數,轉移即爲枚舉下一個要填的數 \(l\):
由於 \(n\) 過大,考慮倍增:
發現第三維是卷積的形式,用 \(NTT\) 優化便可。
設交集大小欽定爲 \(k\) 的方案數爲 \(k\) 爲 \(f(k)\),交集大小剛好爲 \(k\) 的方案數爲 \(g(k)\),二項式反演得:
\(NTT\) 能夠作到 \(O(n\log n)\),但題目要求線性。設容斥係數 \(\alpha(i)\),其知足:
考慮 \(g(i)\) 的貢獻,得:
二項式反演得:
所以複雜度就能作到線性了。
將體積相同的物品一塊兒處理,價值從大到小排序。考慮到體積爲 \(p\) 的物品時,將模 \(p\) 餘數相同的狀態分爲一類來轉移,設餘數爲 \(q\),狀態都形如 \(pi+q\)。發現轉移具備決策單調性,由於相同體積的物品取的越多,價值越小。複雜度爲 \(O(ck\log k)\)。
形如 \(x_1+x_2+\cdots+x_n=n+d\) 的最終序列的方案數爲 \(\binom{d+n-1}{n-1}\),能夠證實這些序列成爲最終序列的機率相同。先將每一個數減一來將正整數轉化爲非負整數,設 \(f_{i,j}\) 爲全部知足 \(x_1+x_2+\cdots+x_i=j\) 的非負整數序列的前 \(r\) 大的值和的總和,枚舉序列中非零位置個數 \(k\) 來轉移:
將非零位置都減一就化爲子問題了,第二項是子問題序列的貢獻。