高度只須要0/1,因此一個合法方案就是一個割,平面圖求最小割。html
反序拓撲排序,每次取出第一類限制最大的放置,這樣作答案不會更劣。
考慮如何求每個的最先時間,同上述拓撲排序,該元素不入隊,當無點可拓展時就是最先時間。數組
對每個左端點維護當前取出了前幾大的右端點,用堆+主席樹維護。網絡
不難發現數列模意義下的進程是:斐波那切數列,首項迴歸0(減一操做),斐波那切數列......
也就是說每一段中分別是一個斐波那切數列,故能夠分段矩乘。
而模\(K\)意義下斐波那切數列循環節不超過\(6K\),因此處理出循環節後暴力。優化
區間離散化,設\(w_{l,r}\)爲區間\([l,r]\)權值,設\(f_{i,j}\)表示前\(i\)個點場地一答案爲\(j\),場地二的最大答案。
考慮算第二問的答案,對於詢問區間,枚舉包含它的大區間。相似\(f\)先處理好後綴答案\(g\)。
預處理大區間答案:\(ans_{l,r}=max_{x,y}\{min(w_{l,r}+f_{l-1,x}+g_{r+1,y}\ ,\ x+y)\}\)。
能夠發現\(x\)上升\(y\)必定不降(爲了平衡兩邊權值),因此只用枚舉\(x\),\(y\)用一個指針維護,複雜度\(O(n^3)\)。ui
建\(AC\)自動機,至關於詢問一個點跳\(fail\)能跳到一條\(dfs\)鏈上的幾個點。
離線\(dfs\),而後用樹狀數組實現子樹加計算答案。spa
把網格圖轉爲二分圖博弈,須要支持移動一步維持匹配、斷定匹配必須點,找交替路便可。指針
暴力,每道菜建點\(v\to T\),每一個廚師建點\(S\to u\)。
對每一個廚師,按天數分層建點,第\(i\)層表示作倒數第\(i\)道菜,並把該點向每道菜連邊,跑費用流。
能夠動態加邊,當一個廚師被增廣後,再給他建新菜的邊,複雜度\(O(nm\sum_{j=1}^p j)\)不滿,能過。htm
擴歐差分後矩陣修改變成單點修改,拿線段樹套線段樹分四個象限維護。blog
套拉格朗日最小乘子法公式:\(F(x_{1\sim n},\delta)=f(x_{1\sim n})+\delta g(x_{1\sim n})\)。
那麼問題變爲求一組解\((x_{1\sim n},\delta)\)知足每一個變量的偏導都是\(0\),\(x_i\)顯然是很好求的,二分便可。
不難發現\(\delta\)與\(F'(x_{1\sim n},\delta)=g(x_{1\sim n})\)呈反比關係,因此乘子\(\delta\)也能夠二分求解。排序
對於一棵樹,從根出發最後必定是到一個葉子。當通過一個度數爲\(p\)的點時,機率乘上\(\frac{1}{p}\)或\(\frac{1}{p-1}\)。
考慮每條邊的貢獻,換根\(dp\)便可。基環樹因爲環很小因此沒什麼區別,大力討論起終點的位置而後暴力。
目前最喜歡的一道\(NOI\)題。
先考慮\(k=2\),顯然能夠構造兩個矩陣\(A,B\),知足\([c_{i,j}]C=A\times B\)爲\(vec_i,vec_j\)的向量內集。
咱們如今的目標是判斷\(A\times B\)是否爲除對角線外全\(1\)的矩陣。
隨機化,經過\(rand\)幾個行向量與原矩陣向量相乘優化矩乘複雜度,而後判斷結果是否相同。
關於\(k=3\),把矩陣\(C\)的每一項平方便可變爲\(k=2\)的問題。
發現\(c_{i,j}=(\sum_{k=1}^n a_{i,k}b_{k,j})^2=\sum_{k=1}^n\sum_{t=1}^n(a_{i,k}a_{i,t})(b_{k,j}b_{t,j})\),因此擴域便可。
考慮計算快餐店落在每條邊上的答案,變爲求基環樹上到某條邊的最長路徑,隨便\(dp\)一下。
問題變爲\(bfn\)序指望分多少層,考慮在一棵樹上\(dfs\)的過程,不難發現:
若\(dfn_{bfs_{i}}>dfn_{bfs_{i+1}}\),則\(i,i+1\)必須分一層,貢獻爲\(1\)。
若\(bfn_{dfs_{i}}<bfn_{dfs_{i+1}}\),則\(bfn_{dfs_{i}},bfn_{dfs_{i+1}}\)最多分一層。剩下的未定點貢獻均爲\(0.5\)。
能夠寫出一個斜率優化的式子,而後上有根樹點分治就好了。
建\(next\)樹,而後\(dfs\)一遍用棧維護便可。也能夠先求\(next\),而後相似求\(next\)的把答案求出來。
建後綴數組,按照\(Height\)從大到小合併,帶權並查集維護答案。
按照\(>\sqrt{n}\)的質因子分層狀壓\(dp\)。
暴力\(dp\),而後把全部路徑摳出來後變爲\(DAG\)覆蓋問題,跑上下界網絡流。
枚舉\(r\),\(l\)顯然隨着\(r\)的增加單調遞增。雙指針後用線段樹判合法,實時更新答案。
純循環小數知足:\(x(K^t-1)\equiv y(mod K)\),因爲\(x\perp y\)故\(K^t\equiv 1(mod\ y)\),有解時\(K\perp y\)。
因此\(Ans=\sum_{x=1}^n\sum_{y=1}^m [x\perp y][K\perp y]=\sum_{y=1}^m[K\perp y]\sum_{d|x,d|y}\mu(d)\)。
故\(Ans=\sum_{d}\mu(d)\lfloor \frac{n}{d}\rfloor\sum_{y=1}^{\lfloor \frac{m}{d} \rfloor} [yd\perp K]=\sum_{d}\lfloor \frac{n}{d}\rfloor(\sum_{y=1}^{\lfloor \frac{m}{d} \rfloor}[K\perp y])\mu(d)[d\perp K]\)。
令\(f(d)=\mu(d)[d\perp K]\),問題變爲求\(\sum_{i=1}^n f(d)\)。
令\(g(d)=[d\perp K]\),能夠發現\(f(d)*g(d)=e\),而後上杜教篩就好了。
使用\(SA\)的頂標法解決。
把水位低於首都水位的地方先扔掉,把城市按水位升序排序。而後瘋狂找(cai)性(jie)質(lun)。
(1)一個水池只會被合併一次,顯然。
(2)最終合併的水池必定是一段後綴且分紅若干連續段合併,反證法顯然。
(3)把水池分開合併比一塊兒合併更優,感性理解手玩一下的確是這樣的。
設\(f_{i,j}\)表示前\(i\)個水池合併\(j\)次的最優解,\(f_{i,j}=min_k\frac{s_i+(f_{k,j-1}-s_k)}{i-k+1}\),其中\(s_i\)爲水位前綴和,左式顯然斜率優化。
(4)斜率優化的決策單調,即\(k\)隨着\(i\)的增長而不降。利用\(s_{i+1}\ge s_{i}+i\),帶入暴力驗證便可。
(5)合併水池長度單調不升,若兩段\(l_i <l_{i+1}\),把\(l_{i+1}\)的第一個元素移到\(l_i\)會更優,列式子暴力驗證便可。
(6)長度大於\(1\)的段不會不少,不超過\(log(\frac{nh}{min(h_i-h_j)})\),即不超過\(14\),打表可得。
而後利用上述性質,咱們只用求解\(f_{i,j\leq 14}\),最後\(dfs\)一遍,用高精小數類求出精確答案。
造計算機神題,題解令開一份:戳這裏
先考慮\(|a|=1,b=1\)的暴力,線段樹模擬二進制,加法就是向高維找\(0\),減法就是向高維找\(1\)。
能夠發現\(b>1\)其實並無什麼不一樣,壓位便可。
用鏈表模擬,每次\(O(K^2)\)暴力合併/刪除便可。考慮每一個點的貢獻能夠分析出複雜度爲\(O(nK)\)。
先把問題轉爲求面積\(\leq K\)的方案數。預處理長度爲\(i(i\leq K)\)的合法方案數,剩下的就是線性遞推。
考慮最低點,設\(f_{i,j}\)表示長度爲\(i\),最低點高度爲\(j\)的合法方案數,其中\(ij\leq K\)故狀態數調和級數。
轉移枚舉最低點在哪(強制選最小最低點):\(f_{i,j}=q^j(1-q)\sum_{k=1}^j (\sum_{l=k+1}^{1000}f_{k-1,l})(\sum_{r=k}^{1000}f_{i-k,r})\)。
搜一下未肯定點的選擇,而後上\(2-sat\)。
首先第\(i-1\)天的蔬菜集合必定是第\(i\)天的子集,因此實際上只用求最大的那天的結果。
建網絡流模型,\(S\to\)每種蔬菜,每種蔬菜按時間建一條鏈,鏈的容量限制按變質遞減,鏈上每一個結點向對應那天連邊。
考慮每次增廣,能夠發現反悔邊沒有鳥用(每種蔬菜只用一個增廣方向),因此考慮模擬費用流。
不難發現找最長路等價於每次取出價值最大的蔬菜增廣,拿個堆維護便可。
最後的問題在於鏈上遞減的容量限制。
由於每種蔬菜對每一天的貢獻都是同樣的,因此貪心的先增廣較晚的天就好了,用並查集搞下。
\(Dij\)預處理\(1\)到每一個點的最短路。建\(Kruskal\)重構樹,問題變爲子樹最小值,隨便維護下。
合法的充要條件爲:不存在長度爲\(3\)的降低序列。
稍加思考能夠獲得\(dp\):設\(f_{i,j}\)表示前\(i\)個的最大值爲\(j\),轉移\(f_{i,j}=\sum_{k=1}^j f_{i-1,k}\),其中\(j\ge i\)。
加了字典序的限制,考慮數位\(dp\),即咱們須要直到一個後綴的方案數。
設\(g_{i,j}\)表示還有\(i\)個數要放,前面放的數的最大值爲\(j\)的方案數,轉移\(g_{i,j}=\sum_{k=j}^nf_{i+1,k}\),其中\(j\ge n-i+1\)。
用網格圖優化一下\(g\)的求解,而後用樹狀數組維護合法性,從前日後數位\(dp\)求出答案。
先求\(T\)有多少不一樣子串,而後求\(T\)的每一個前綴在\(S\)上的匹配長度,這個放在\(S\)的\(SAM\)上跑一下便可。
爲了防止算重,對\(T\)也建\(SAM\),而後在這個\(SAM\)上跑一遍把答案跑出來。
用\(set\)把每次戰鬥的劍搞出來,用擴歐把式子化爲同餘方程,而後上\(EXCRT\)。
設\(Len_{(u,v)}\)表示路徑\((u,v)\)的長度。根據部分分的提示,分\(S_1,S_2\)兩種狀況討論:
(1)兩條路徑的\(lca\)不一樣:
咱們能夠把路徑\((u,v)\)拆成兩條直上直下的路徑\((u,z)\),其中\(dep_u>dep_z\)。
那麼路徑的交是一條從上往下的鏈,設爲\((a,b)\),其中\(dep_a>dep_b\)。
考慮枚舉\(a\),那麼就是選兩條路徑\((u_1,z_1),(u_2,z_2)\)知足\(u_1,u_2\)在\(a\)的不一樣子樹中。
這組選擇的答案爲:\(Len_{(u_1,v_1)}+Len_{(u_2,v_2)}+val_1+val_2-dis_a+max(dis_{z_1},dis_{z_2})\)。
設\(f_{x,j}\)表示\(u\)在\(x\)子樹內,\(dep_z=j\)的最優信息,用線段樹合併維護一下這個值並求答案。
(2)兩條路徑的\(lca\)相同:
首先對每一個\(lca\)建虛樹。對每一個虛樹分別求一遍。
設\((u_1,v_1),(u_2,v_2)\)的路徑交爲\((a,b)\),其中\(u_1,u_2\)在\(a\)子樹中。
一個關鍵的轉化:答案的兩倍=\(Len_{(u_1,v_1)}+Len_{(u_2,v_2)}+val_1+val_2+dis(u_1,u_2)+dis(v_1,v_2)\)。
考慮枚舉\(a\),那麼令\(W_{(u_1,v_1)}=Len_{u_1,v_1}+val_1+dis_{u_1}\)。
答案變爲\(dis(v_1,v_2)+W_{(u_1,v_1)}+W(u_2,v_2)-2dis_{a}\),\(-2dis_a\)扔掉,就是一個集合直徑問題。
額外掛的邊權值可能爲負,但分析可知這張圖依舊知足正權直徑定理,因此暴力合併便可。
結合兩部分就是正解,第一部分爲\(O(nlogn)\),第二部分爲\(O(n+m)\),須要注意實現細節。