JSOI部分題解
JSOI2019
神經網絡
考慮把依次經過的樹寫成一個序列並放在一個環上,那么這個序列所要滿足的條件就是開頭必須是\(1\),相鄰的兩個數不相同且首尾不能均為\(1\)(如果均為\(1\)的話會算重)。
對於每一棵樹,我們可以設\(f_{i,j,0/1/2}\)表示以\(i\)為根,將這棵樹划分為\(j\)條鏈,\(i\)已經連了\(0/1/2\)條邊的方案數,這樣就可以把一棵樹划分為\(i\)條鏈的方案數算出來了,因為這題鏈有方向,所以節點數\(>1\)的鏈方案要乘\(2\)。
令\(f_i\)表示某棵樹划為\(i\)條鏈的划分數,構造EGF。
首先我們不考慮\(1\)的情況,那么有
其中\(i!\)是他們內部排列數,\({i-1\choose j}\)是強制相鄰的兩個並起來的方案數,\((-1)^j\)是容斥系數。
把\(1\)考慮進來,就是我們欽定\(1\)中的第一個數必須放在第一個位置除去環的限制,它不參與內部排列也不參與外部排列,那么有
最后再減去考慮首尾均為\(1\)的情況,那么就是最后一個點不參與外部排列但參與內部排列:
最后把所有EGF卷起來把\([x^i]\)乘上\(i!\)再相加就是答案。
精准預測
這個題的約束條件很像\(\text{2-sat}\),往這方面考慮。
題目所給的約束條件可以直接連邊,還有約束條件的話就是如果一個人在\(t\)時刻活着那么在\(t-1\)時刻活着,在\(t\)時刻死了那么在\(t+1\)時刻死了。
然后再看每個點\(T+1\)時刻死了能到達多少個其他點活着的就行了,假設有\(cnt\)個,那么該點的答案就是\(n-cnt-1\),這個可以通過\(\text{bitset}\)優化拓撲排序dp求出。
但是\(\text{bitset}\)還是存不下所以要分段跑,注意如果一個點必死那么它不能算進貢獻。
節日慶典
可以維護出可能出現的最小的后綴的集合,發現集合中的數不超過\(\log n\)個。
證明參考 zsy 的:
簡單證一下這個性質:考慮相鄰的兩個最小后綴\(i,j\),若\(|j|<|i|<2|j|\),則說明\(i=AAB,j=AB\),其中\(A,B\)均為字符串,且\(B\)是\(A\)的一個嚴格前綴。此時考慮\(i=AAB,j=AB,k=B\),可以發現無論如何最小后綴都會在\(i\)和\(k\)之間產生,\(j\)不可能成為最小后綴(如果\(j\)比\(i\)優,那么一定有\(k\)比\(j\)優),由此說明相鄰兩個最小后綴的長度至少\(\times 2\),因此數量不超過\(\log n\)。
這題的數據范圍較大,所以維護\(lcp\)時食用\(\text{Z-algorithm}\)維護。
JSOI2018
戰爭
問題轉化為給定你兩個凸包\(\mathbb S,\mathbb T\),每次獨立的詢問將\(\mathbb T\)中的每個點移動一個向量,問\(\mathbb S,\mathbb T'\)是否有交。
我們知道對於兩個凸包\(\mathbb {A,B}\)的閔可夫斯基和為\(\mathbb C=\{\vec a\in\mathbb A,\vec b\in \mathbb B\;|\;\vec a+\vec b\}\),
而兩個凸包對於一次移動向量\(\vec w\)有交,則存在\(\vec a=\vec b+\vec w\Leftrightarrow\vec w=\vec a-\vec b\)。
那么構造\(\mathbb Q=\{-\vec t\;|\;\vec t\in \mathbb T\}\),構造\(\mathbb P=\mathbb{S+Q}\),每次判斷是否有\(\vec w\in\mathbb P\)即可。
列隊
可以貪心地想,將\([l,r]\)內所有人的休息點從小到大排序后依次放入\(K...K+r-l\)答案是最優的。
那么現在問題主要轉化為如何快速求\(\sum_{i\in [l,r]} |a_i-(K+i-l)|\)(假設\(a\)已排好序)。
這時候可以對於原序列\(\{a\}\)建主席樹維護個數及\(a\)的和,考慮拆掉絕對值的話就是二分\(mid\),表示\(a\)大小前的\(mid\)名均有\(a_i\leq K+i-1\),因為\(a\)兩兩不同所以可以保證存在一個這樣的分界點。
直接在外面二分后用等差數列求和算答案復雜度為\(O(n\log^2 n)\)可以獲得\(70pts\),改為在主席樹上二分復雜度\(O(n\log n)\)可獲得滿分。
潛入行動
有一個顯然的dp是設\(f[x][i][0/1][0/1]\)表示\(x\)的子樹內安裝了\(i\)個監聽器,他自己不選/選,他父親不選/選的方案數。
轉移較為繁瑣而且容易實現,這里不再贅述。
考慮復雜度:乍一看復雜度為\(O(nk^2)\)但是仔細思考發現滿足度數為\(k\)的點最多\(\frac nk\)個,那么最終復雜度為\(O(nk)\)。
防御網絡
題意:求從一個仙人球中任選一個點集所構成的斯坦納樹大小的期望。
考慮每條邊的貢獻,如果一條邊不再環內的話貢獻很好算。
那么主要問題就是解決環上的邊怎么算貢獻,只考慮某一個環,如果一個點的子樹內選擇了點的話就把環上這個點給標記出來,那么最后選擇的東西就一定是整個環的長度減去相鄰兩個被選中的點的最大距離。
設\(f_x\)表示相鄰兩點最大長度不超過\(x\)的方案數,那么對於一個\(x\),它的方案數就是\(f_x-f_{x-1}\)。
因為是一個環,斷環為鏈后枚舉最左被選擇邊的點就可以消除原來環的影響。
剩下的部分考慮dp,設\(g_i\)表示當前在第\(i\)個點且強制選第\(i\)個點的方案數,轉移時強制長度差不超過\(x\)前綴和優化即可。
最終復雜度\(O(n^3)\)。
絕地反擊
這里提供兩種方法:
方法一:
是我自己想到的,對於圓上點的排列,假設所有點均由正方向旋轉度數\(\alpha\),那么最優解函數\(f(\alpha)\)一定為一個單峰函數。
三分\(\alpha\)后再二分時間\(t\),將到達時間\(\leq mid\)的我方艦隊向敵方母艦連邊,跑二分圖匹配看是否有完美匹配即可。
方法二:
二分時間\(t\),那么對於每艘戰艦在圓弧上的交點至多只有\(2\)個,而對於旋轉,可以發現本質不同的轉法一定是有一個點轉到了這\(2n\)個交點中的其中一個。
我們將這\(2n\)個轉角極角排序(這\(2n\)個點可用余弦定理算出),則每次改變轉角最多加入或刪除一組匹配,手動模擬退流即可,復雜度\(O(二分圖匹配\times\log n)\)。
JSOI2016
最佳團體
考慮01分數規划,那么我們現在二分了比值\(mid\),每個點有一個新的權值\(c_i=p_i-s_i\times mid\),
現在要求在滿足條件的情況下使\(\sum c\)最大,樹形背包即可。
獨特的樹葉
因為是樹的同構問題,考慮樹哈希。
有一種異或的樹哈希方法(\(f\)為哈希數組):
通過換根可以求出以每個點為根的\(f\)值,將\(A,B\)樹分別哈希並將\(A\)中的每個哈希值丟到set中,如果有\(B\)中有一個葉節點的父親去掉(xor)對應葉節點的\(f\)值后這個哈希值不在這個set中,說明對應的葉節點就是那個多余的點。
扭動的回文串
單獨存在於\(A,B\)串中間的回文串可以直接\(\text {manacher}\)求出,考慮“扭動”形成的回文串。
枚舉回文中心,因為“扭動”的回文串,必然在\(A\)或\(B\)中對應有一個最長的回文串,這是\(\text{manacher}\)就已經求出來了的,再用二分+哈希把兩串拼一起所形成的新串能夠再拓展的最大長度弄出來即可。
燈塔
其實就是要你對於每一個\(i\)求出\(p_i=\lceil\max\limits_{j}(a_j-a_i+\sqrt{|i-j|})\rceil\)。
有一種做法就是對於每個\(i\),\(\sqrt{|i-j|}\)的取值不超過\(\sqrt n\)個,而且對於每個\(i\)和某個取值\(x\),所對應的\(j\)一定在一段或兩端連續的區間中,可以用st表查詢最大的\(a_j\),復雜度\(O(n\sqrt n)\)。
另外一種做法只考慮\(j<i\)的情況,之后通過\(\text{reverse}\)求出\(j>i\)的情況,而可以發現決策點具有決策單調性,用決策單調性優化可以做到\(O(n\log n)\)。
位運算
假設我們選出來的數\(A_1,A_2...A_N\)滿足,\(A_0> A_1\geq A_2...\geq A_N\),其中為了方便我們令\(A_0=R\)。
考慮狀壓這\(N+1\)個數的大小關系,那么狀態\(s\)有\(N\)位,每一位\(0/1\)表示\(A_i(>\text {or}=) A_{i+1}\),設\(f_{i,s}\)表示當前從高往低考慮到第\(i\)位大小關系為\(s\)的方案數,枚舉當前位的填數情況\(t\)可以進行轉移,而對於每個循環的轉移時一樣的,處理完一個循環的情況后可以矩陣快速冪求出方案數。
炸彈攻擊
這題比較玄學,網上所查得到的大部分題解說是模擬退火實則爬山算法。
就直接按照隨機化的方法\(\text{rand}\)一個移動向量看是否更優即可,溫度、溫度變化量、eps以及一些退火中的tricks網上都有,這里不再贅述。
飛機調度
首先可以想到\(\text{floyd}\)求出任意兩點之間的最短路,因為存在維修時間所以要將\(dis_{i,j}\)設為\(g_{i,j}+p_j\)。
假設某一趟航班\(i\)從\(x_i\rightarrow y_i\),時間由\(s_i\rightarrow t_i(t_i=s_i+T_{x_i,y_i}+p_{y_i})\),那么對於航班\(j\),如果想讓\(i,j\)共用一趟飛機則必須滿足\(t_i+dis_{y_i,x_j}\leq s_j\)。
我們將\(i\rightarrow j\)連一條邊,發現整張圖一定是個DAG,直接跑最小路徑覆蓋即可。
無界單詞
首先考慮第一問,設\(f_i\)表示長度為\(i\)的\(|border|=0\)的串的個數。
我們考慮容斥,減去\(|border|>0\)的情況,因為如果\(|border|\geq \lceil\frac i2\rceil\),那么可以減去中間公共部分變成\(<\lceil\frac i2\rceil\)的情況,所以有
對於第二問考慮二分,則問題實際上變為求前綴為\(s\)時的\(f_i\)。
顯然有\(f_i=[前i個字符無border],i\leq |s|\)。
對於\(i>|s|\),則分類討論之:
首先有
其中\(c_{i,j}\)表示系數,有:
然后按照這種方法轉移就好了。
輕重路徑
首先可以用樹狀數組單點加、區間查詢維護每個點的\(size\)。
考慮這一次我們刪掉了葉子\(x\),那么對於\(x\)到根\(rt\)的路徑,如果要滿足上面的一個點\(u\)它要改變他由重變輕的話必有\(size_u\leq \frac {size_{rt}}2\),我們可以二分這個點,那么這樣的話最多二分\(O(\log n)\)次。
判定一條邊是否從重邊變成輕邊的依據是父親的重兒子之前指向\(u\),同時刪除節點后有 \(size_u+1=size_{another\_son}\),注意特判\(u\)是父親子樹最后一個節點的情況。
復雜度\(O(n\log ^3n)\)但是樹狀數組以及樹剖、二分的常數都比較小,還有這題的思路感覺比較類似於CSP2019樹的重心。
病毒感染
題目的意思是如果往左走就要把之前左邊沒治愈的治愈完。
那么整個過程可以分為若干個子段,每個子段治完子段中的所有村庄然后再回到該子段的起點繼續治接下來的子段。
設\(f_i\)表示目前在\(i\)且\(1...i\)均治愈完畢的最小代價,轉移的話枚舉這個子段的起點:
其中\(s\)為前綴和\(g_{i,j}\)為\(i\)走到\(j\)再回到\(i\)所花費的最小代價。
考慮\(g_{i,j}\)由\(g_{i+1,j}\)轉移過來,枚舉\(i\)在不在當時治愈有:
然后就可以dp了。
反質數序列
考慮到奇數和奇數、偶數和偶數之間不可能為質數,那么所有元素就構成了一個二分圖。
其中奇、偶之間如果是質數的話就連一條邊,答案就是最大獨立集也就是\(|\mathbb V|-\)最大匹配,注意\(1\)選的個數不能超過\(1\),所以\(1\)只要保留一個。
炸彈攻擊2
考慮枚舉每一個發射源,算出每個發射源的貢獻。
將這個發射源作為原點,將其他除了發射源之外的點放一起極角排序,因為題目保證所有敵人都在己方單位上面,所以答案就是兩個極角不超過\(\pi\)的激光塔之間所夾的敵人數,又因為這題實際上是個環的結構,所以需要斷環為鏈+前綴和維護。
JSOI2015
salesman
直接樹dp+貪心即可。注意如果選了某個子樹的權值為0那么也說明不唯一(可以不選)
isomorphism
很容易就可以\(O(n)\)把簡化之后的樹給建出來,建出來之后用樹哈希判一下即可。
這個題不用像[JSOI2016]獨特的樹葉那樣把每個點為根的哈希值求出來你就直接求一下重心的哈希值就好了,注意重心可能有兩個。
子集選取
每個數都是獨立的,答案一定是\(w^n\)的形式。觀察發現答案就是\(2^{nk}\),可以列出遞推式然后歸納證明。
送禮物
首先考慮二分答案。
那么就是要判斷是否有
化簡得:
發現最優解一定是左右端點分別為最大/最小值,不妨令右端點取到最大值,左端點取到最小值(可以\(\text{reverse}\)得到另一種情況),那么我們將數組\(a\)中的每個數\(a_i\)新賦權值為\(a_i-i\times \text{mid}\),跑一遍單調隊列即可。
注意有可能區間長度\(\leq L\)而不存在上述情況,需要將答案對於\(\max_{i=1}^{i+L-1}\frac {\text M(i,i+L-1) - \text m(i,i+L-1)}{L-1+K}\)取max。
字符串樹
從根節點往下建立可持久化\(\text{Trie}\),對於每個詢問直接查即可,操作都比較模板,這里不再贅述。
非誠勿擾
根據期望的線性性,我們的答案就是\(\sum_{i=1}^N\sum_{j=i+1}^N sum(i,j)\),其中\(sum(i,j)\)表示\(i,j\)之間的貢獻。
那么這個\(sum(i,j)\)就是直接對於\(j\)的每個如意郎君,算出\(i\)每個編號比他大的被選中概率之和\(s\),然后用這個如意郎君被選中的概率\(\times s\)就可以算出。
而這個東西是可以按照女生編號從小到大然后用樹狀數組維護的,我們需要解決的最后一個問題就變為了如何求出在長度為\(l\)的列表中,第\(k\)個男生被選中的概率\(P\)。
那么有:
然后就做完了。
套娃
對套娃按\(B_i\)排序,按順序處理每一個套娃的內徑,在所有套娃的外徑中找到一個可以套入當前內徑的前提下最大的外徑(也可能找不到),將其套入該內徑,並刪除之。
正確性證明:令當前套娃好看度為\(B_i\),若被上述算法選中的外徑沒有被套入這個套娃中,而是套到了一個\(B_j\leq B_i\)的套娃中,那么交換\(i\)和\(j\)內部的外徑不會使方案變得更劣。
(該題題解來源於cz_xuyixuan)
最小表示
如果對於一條邊\(u\rightarrow v\)存在另外一條\(u\rightarrow v\)的路徑,那么這條邊就可以刪去,而且每條邊之間互不影響。
那么用\(\text{bitset}\)對每個點分別維護可以到達它的集合,那么對於一條邊\(u\rightarrow v\),如果有\(u\)的出點集合\(\mathbb S\)及可以到達\(v\)的點集\(\mathbb T\),使得\(|\mathbb S\bigcap \mathbb T|>1\),則滿足上述情況,可以刪去。
圈地
經典的二元關系最小割模型,如果一塊地在殘余網絡中與\(S\)和\(T\)聯通分別表示這塊地被兩人之一,而兩塊地之間的連邊表示修牆的代價,割一條邊就可以表示出修一堵牆。
串分割
因為肯定要使位數最多的數位數最少,所以可以算出來位數最多的數有多少個以及多少位(記為\(len\))。
因為是個環所以考慮斷環為鏈后倍長,再后綴排序一遍就可以二分答案了。
枚舉每個開頭位置\(i\),從\(i\)往后跳,如果\(rank_i>\text{mid}\)那么這個數就不能有\(len\)位,只能往后跳\(len-1\)位,否則就跳\(len\)位。
最后判斷一下最終位置是否\(\geq i+n\)即可。
染色問題
這種限制條件一堆的題考慮容斥。
枚舉,至少不塗\(i\)行、至少不塗\(j\)列,至少不用\(k\)種顏色,那么式子就很顯然了:
最大公約數
首先對於所有以一個位置\(i\)結尾的子段\(\gcd\)不超過\(\log\)個且連續。
那么直接用\(\text{map}\)維護一下每種\(\gcd\)的最前面的出現位置,每加入一個數暴力更新一下即可,復雜度\(O(n\log^2)\)。
地鐵線路
這道題提供兩種方法:
第一種方法是我自己的方法:
首先考慮第一問,對於一條線路\(a_1,a_2...a_L\),新建兩排點\(b_1...b_L\),\(c_1...c_L\),同時連邊\(b_1\rightarrow b_2...\rightarrow b_L\),\(c_1\leftarrow c_2...\leftarrow c_L\),邊權均為\(0\),表示一條線路的來回。再連對於\(\forall i\),連\(b_i\rightarrow a_i,c_i\rightarrow a_i\),邊權均為\(0\)表示下車,\(b_i\leftarrow a_i,c_i\leftarrow a_i\)邊權均為\(1\)表示上車,這樣子由\(S\)跑一遍\(01bfs\)可以解決第一問。
再考慮第二問,其實已經很好解決了,直接在最短路圖上面跑一遍拓撲排序就可以了,需要注意如果是上下車貢獻是不會增加的。
第二種方法是網上的方法:
第一問對於每條線路新建一個點,線路上的站向線路連邊權為\(1\)的邊,線路向線路上的站連邊權為\(0\)的邊,然后\(01bfs\)。
第二問考慮dp。設\(f_i\)表示到達\(i\)時最多乘坐多少分鍾的地鐵。
假設一條線路的\(dis\)為\(d\),則我們可能在\(dis\)為\(d-1\)的站上車,在\(dis\)為\(d\)的站下車,所以我們要用 \(dis\)為\(d-1\)的站更新\(dis\)為\(d\)的站。
把所有線路按\(dis\)從小到大排序,然后對於每條線路轉移:\(dp_i \leftarrow dp_j + dis(i, j),dis_i = dis_j + 1\)。記一下前后綴最大值即可\(O(n)\)轉移。
JSOI2014
拼圖
看到\(N\times (M=\sum w)\leq L=10^5\)考慮分塊。
接下來分類討論:
-
\(N<M\)
考慮枚舉答案在哪兩行之間,如果在一個塊內我們可以直接求出來。
如果在多個塊中間的話,我們肯定把中間全白的塊放在中間,然后再在左右分別放上右邊/左邊白色列數最多的塊。注意可能會重復那么我們選次大的(還有些實現細節詳見代碼)。
此時復雜度為\(O(N^2M)=O(L\sqrt L)\)。 -
\(N>M\)
預處理出每個點最多向上延伸到哪一行\(up\),我們枚舉時就直接以某個點所在的行為下界,以那個點的\(up\)為上界可以用\(O(NM)\)代替原來的\(O(N^2)\)枚舉。
我們再用原來的方法可以\(O(M)\)求出在當前狀態下的最大答案。
此時復雜度為\(O(NM^2)=O(L\sqrt L)\)。
宅男計划
現在假裝我們知道了購買外賣的總次數\(k\),那么我們的問題就變成了如何確定每種外賣購買方案。
首先將所有外賣按照價格排序,顯然只要沒有過期那么一定會購買盡可能多的更便宜的外賣。
假設對於最便宜的外賣,其過期的天數是\(s\),那么我們一定會在每次購買的時候都買\(s\)份,那么接下來的每一份外賣都是類似的處理。
這個總次數\(k\)是可以三分的,但是考場上如果不放心可以選擇模擬退火。
騎士游戲
設\(f_i\)表示打死怪物\(i\)的最小代價,轉移很簡單,但是這個轉移是有環的,我們換個方式,用\(spfa\)轉移即可。
支線劇情
上下界網絡流板子題,每條邊下界為\(1\)再跑費用流即可。
奇怪的計算器
將所有詢問離線並從小到大排序。
那么在\([L,R]\)之間的數一定是一段區間\([l,r]\),將\([1,l-1]\)區間賦值為\(L\),\([r+1,Q]\)區間賦值為\(R\)即可。
頭鐵的話可以直接維護所有操作,但是這里有個小 trick :
考慮這樣一個函數\(f(a_1,a_2,a_3)=a_1\times c_i+a_2\times a_i+a_3\)
其中\(c_i\)代表\(i\)這個位置現在的數, \(a_i\)代表\(i\)這個位置原來的數,
那么每次操作都可以看做對應位置加這個函數:
- 加\(k\rightarrow f(1,0,k)\)
- 減\(k\rightarrow f(1,0,−k)\)
- 乘\(k\rightarrow f(k,0,0)\)
- @\(k\rightarrow f(1,k,0)\)
線段樹維護一下每個位置的\(f\)就好了。
支線劇情2
設\(f_i\)表示只在\(i\)存檔訪問完以\(i\)為根的子樹的最短時間,有
其中\(s_i\)表示\(i\)子樹內葉子結點的個數。
再設\(g_i\)表示可以在\(i\)子樹內存檔的最短時間,考慮轉移:
對於一個子節點\(j\),
要么不在\(j\)的子樹內存檔,此時貢獻為\(f_j+s_j\times cost_{i,j}\)
要么把存檔點移至\(j\),此時貢獻為\(g_j+cost_{i,j}+dis\),\(dis\)表示\(i\)到根的距離。
還需注意一下有一個子樹的貢獻可以變為\(g_j+cost_{i,j}\)。
答案即為\(g_1\)。
強連通圖
第一問可以直接縮點,考慮怎么做第二問。
縮點后將所有入度為\(0\)的強聯通分量(共\(n\)個)和所有出度為\(0\)的強聯通分量(共\(m\)個)拿出來分別排在左邊和右邊,如果可以到達就左邊向右邊連有向邊,那么原圖構成一個二分圖且滿足每個點都有入度或出度。
我們的目標就是使這個二分圖強聯通。
假定答案下界為\(max\{n,m\}\),那么答案一定不小於因為如果這個二分圖存在完美匹配肯定最優(可以直接連交錯環),而此時都需要\(n+m-min\{n,m\}=max\{n,m\}\)步。
接下來考慮構造這個下界。
從二分圖中找一個極大匹配\(\mathbb S\),那么在這個匹配中,連接交錯環可以做到\(\frac{|\mathbb S|}2\)步。
因為這個匹配是極大的而且每一個點都存在入度或出度,所以不在該匹配\(\mathbb S\)中的點一定可以從\(\mathbb S\)到達或被到達。
分別我們選擇左右兩個點連接交錯環,那么此時\(\Delta\)步數=\(\Delta\)點數/2。
對於剩下的沒有匹配的點,均可一步連到這個匹配上,此時\(\Delta\)步數=\(\Delta\)點數。
綜上,我們共用\(\min\{n,m\}+(\max\{n,m\}-\min\{n,m\})=\max\{n,m\}\)步,構造完畢。
歌劇表演
可以發現進行一次演出就可以將當次演出的演員與其他演員區分開來。
根據這條性質,我們一開始將所有演員存在一個\(\text{set}\)中,第一次演出是將演出成員從\(\text{set}\)中刪除再加入一個新的\(\text{set}\),第二次演出時再將兩個\(\text{set}\)中的演員從所在\(\text{set}\)中刪除再分別放入新的兩個\(\text{set}\)中,以此類推。
發現這樣子做的話所在\(\text{set}\)只有他一個的演員可以分辨出來。
士兵部署
轉化下題意:給定一個凸包,每次新加入一個點,問每次加入這個點后的新的凸包面積。
首先在凸包內凸包面積肯定不變,否則要求出這個點關於凸包的兩個切點。
選一個凸包內的點作為新的原點,將所有詢問離線后按極角排序,每個切點可以在與當前點極角差不超過\(\pi\)的凸包上的點中二分后用叉積判斷,注意你已經將詢問離線所以二分的范圍你是可以依次尺取出來的。
其中還有斷環為鏈的細節等詳見代碼。
回文串
對於一段區間\([l,r]\),令\(mid=(l+r)/2\)我們可以將其轉化為\([l,mid]\)和\([mid+1,r]\)的貢獻之和,這樣子做的好處是可以確定一個超出\([l,r]\)的回文串到底是先觸碰到哪個邊界。
這樣子的話我們可以對於未超出邊界的與超出邊界的分開算貢獻,用主席樹維護即可。
電信網絡
最大權閉合子圖模板題,不再贅述。
打兔子
首先注意到如果打過了的地方和打過了的相鄰的地方你都不會再打,那么我們就可以分類討論一下\(1,n\)是怎么打的把環的限制去掉,然后設\(f[i][j][0/1]\)表示目前打到第\(i\)塊地,開了\(j\)槍,這塊地打沒打的最優值即可,轉移比較簡單。
注意一下這個狀態如果\(K\geq \lceil\frac N2\rceil\)時不滿足,但是你可以直接打完所有兔子,還要注意下\(N=3\;K=2\)的情況。
序列維護
線段樹模板題
學生選課
考慮二分答案,之后剩下的二元關系直接用\(\text{2-sat}\)進行\(\text{check}\)。
矩形並
首先有一個比較巧妙的算答案的方法:將所有矩形內部進行矩形加一的操作,然后依次查詢所有矩形內部的權值和,加起來,最后再減去所有矩形的面積和,所得的結果再除\(\frac{n(n-1)}2\)即為答案。
考慮怎么進行矩形加,矩形查詢操作。
我們現在先看一下普通的二維樹狀數組怎么完成上述操作:
其實就是要求
記差分數組\(d\),使得
那么就有
可以拆成四個樹狀數組分別維護。
至於這題,我們可以將一維離線下來然后另外一維樹狀數組維護完成。
