牛客國慶集訓派對Day6——題解
A Birthday
思路:考慮費用流時把每個part拆成個點,選擇第個點的代表為放置塊蛋糕和塊蛋糕的時間差,這個時間差是遞增的,因此在費用流的過程中必定會從小到大選擇
具體建圖:左邊個點代表個蛋糕,右邊個點代表個part,每個part拆成個點。源點向每個左邊的點連一條流量費用的邊,每個右邊的點向匯點連一條流量費用的編。每個蛋糕向可以放的兩個part的所有點連邊,連向第個點的費用為,流量為。這樣求最小費用流既為答案。
B Board
把格子染色,第行第列格子的顏色為 % 。那麼每次操作時,必定是種不同的顏色都有一格被操作到,因此最後任何顏色格子的和必定是相等的。因此只需要記錄每種顏色格子的和,並算出缺失格子的顏色C,用其餘顏色的和減去顏色C的和即可
C Circle
因為且,所以把依次放進一個環,就可以啦。答案為。
D 土龍弟弟
下面會有一些定義。出此題是期望比賽的時候大家憑感覺得到結論,不證明。
首先題目問的是在torus上扣若干個洞,所得曲面上的閉環的同倫等價類。(定義:torus:就是我們定義的地圖,形似甜甜圈。閉環:就是說土龍弟弟一天走的路徑。因為會回來所以叫閉環。同倫等價類:就是一個土龍弟弟的路線可能會變換。凡是可能屬於同一個土龍弟弟的兩條路線就是相互同倫的。題目問的就是最少能分成多少組使得組內相互同倫。)
我們把扣掉的洞用線連起來,使得線之間不相交且按照線將曲面分割成若干簡單的部分。(簡單的部分:就是這一部分是你在紙上隨便畫個不自交的閉環得到的東西。簡單是因為這一個區域中所有的閉環都同倫,因為可以縮小到很小再移動到一起。)
分割區域這一步需要小構造一下。大體思路就是每一行都畫一條橫的線,這線實際會被洞分割成多條線。然後有些區域是個環(即從左邊走到最右邊再向右回到最左邊),即並非簡單區域。這些區域再畫一條豎線。
這樣分割後,一個閉環就可以用依次穿過的線的編號組成的字串來表示(除了記錄哪條線,方向也有用。並且由於是環,字串也是迴圈的。)然後消去相鄰相反括號(即連續的正穿和反穿同一條線的部分。因為每個區域都是簡單的,所以連續正穿和反穿中間的部分可以不斷收縮直到不穿過這條線,所以消去後所得的曲線和之前是同倫的。)最後為了判斷迴圈串相等要用最小表示法。
證明:我們要證的是同倫當且僅當消去相鄰相反括號後的序列迴圈相等。
假設a經過消括號得到(不能再消的),顯然a和b是同倫的,因為每一步都同倫。假設消括號得到。如果和迴圈相等,a和b同倫。這就證明了一半。反過來,對一個曲線做同倫變換時,只能產生或消除相鄰的相反括號。所以如果和不等,他們又都沒有相鄰相反括號可以消去,它們就不可能通過產生和消除相鄰相反括號相互轉換,即和不同倫,即和不可能同倫。
最後注意沒有洞是特殊情況。題面裡除去了這種情況。其實torus上扣若干洞後的基本群總是free group,但是沒扣洞時的基本群是(平面整數格點加法群)。
E Growth
把獎勵的拿出來從小到大排序,得到。
把獎勵的拿出來從小到大排序,得到。
用 表示值到達,值達到時接下來每天可以得到的獎勵。
其中 為滿足的獎勵的總和。
用 表示值達到,值達到時已經拿到的獎勵的最大值。
最後統計一下答案就可以了。
F kingdom
代表個點時的答案,代表若干顆樹加起來,和為,每棵樹時,這些樹的代價和最大是多少
從到列舉,在固定時列舉心腹的影響力大小更新,然後用類似揹包的思路更新
複雜度
G Matrix
個格子的重心的座標為。
那麼其實我們只要維護就可以了。
假設我們現在有一個頂點為的三角形,我們想要推到頂點為的三角形,觀察兩者之間的差異,會發現在推過去的過程中,其實就是刪去了一個斜條,又加入了一個斜條。
同理,從到其實只是刪去了兩個斜條,加上了底上的橫條,而這些關鍵的值都是可以通過字首和的方法維護。
H Mountain
考慮山中最高的一座,最優操作一定是從第一座山的左下角開始不停地往上爬,然後從最高的山不停地往下爬爬到最後一座山的右下角。
所以答案為最高山的高度。
I 清明夢超能力者黃YY
首先每條路徑從LCA處分開可以拆成兩條鏈
假設鏈執行了第次染色操作,假設是的祖先,那麼我們在點加入一個"插入"的事件,在的父親點加入一個"刪除i"的事件
然後整顆樹求解,每個點維護一個線段樹。處理一個點時先合併所有兒子的線段樹,然後再處理這個點上的事件,得到線段樹之後詢問第大值既可得到答案。
複雜度分析:
Node* merge(Node* a, Node* b) {
if (a == NULL) return b;
if (b == NULL) return a;
a->sum += b->sum;
a->child[0] = merge(a->child[0], b->child[0]);
a->child[1] = merge(a->child[1], b->child[1]);
return a;
}
考慮以上的線段樹合併,每次合併會減少一個區間。而在事件點插入、刪除的時候會產生至多個區間,因此複雜度為