---
# System prepended metadata

title: 'TPOJ Round #4 Editorial'

---

TPOJ Round #4 Editorial
===
各題題目作者：
pA: Problem Idea: CatAgain, Statement: CatAgain
pB: Problem Idea: CatAgain, Statement: CatAgain
pC: Problem Idea: CatAgain, Statement: CatAgain
pD: Problem Idea: HNO2, Statement: CatAgain
pE: Problem Idea: HNO2, Statement: CatAgain
pF: Problem Idea: HNO2, Statement: CatAgain
pG: Problem Idea: HNO2, Statement: CatAgain
## pA. Hacked by the Red Box
> 題目會給$10$個相異的二進位碼，分別代表數字$0 \sim 9$加密後的結果。現在給定一個長度$50$、由$0、1$組成的字串，請你把它還原成$5$位的阿拉伯數字字串。(測資保證有唯一解。)

### Solution 
這題限制實在過於寬鬆，題目又保證唯一解、加密後的二進位碼皆相異，所以直接把$10$個二進位碼存下來，暴力搜索即可。

## pB. 金閃閃與他打結的天之鎖
> 題目給了你一棵樹，要求最小高度。


###### 天啊演算法筆記竟然有答案QQQ

### 盲點

可能會有人把它當成樹重心做?

### Solution 1 dfs(演算法筆記的)
一棵無根樹的直徑，恰好是相離最遠的兩個點的距離，所以求出直徑的中點即可。

### Solution 2 greedy(原解)
最外圍的節點(入度為一)，可以直觀得知不會是我們所要的答案，故可以直節拔除。
如此拔到剩下$1、2$個節點時，所剩即為所求。

### Solution 3(暴力)
其實這題 $n$ 也不算很大，枚舉每個節點就是了。

>[name=CatAgain]真假QQQQ 不早說QQQ 該不會有人真的這樣做吧?QQQ
>[name=HNO2]其實我一開始把 $n$ 調小的目的就在這(?)
>不然scoreboard會更難看(?)
>[name=CatAgain]大家都正解OwOb
## pC. 八九寺的背包有十五公斤重
>有$n$種物品，每個有其重量$m$，然而，取到的第 $k$ 個某物品會變$p^{k-1}$倍重，求背包可裝的最大價值。

### Solution
首先，如果$p=1$，那就是水水的背包了。

所以接下來考慮$p \neq 1$的情況。
##### 比賽中也看到很多種寫法，這裡就不全放了。
把每個物品的每種重量分開做(物品重量不可能超過背包負重，故就算列出每種重量，也不會太多)，變成01背包。其中，我們甚至可以發現，不用強迫小倍率的物品先被拿，因為兩者價值相同但小倍率的比較輕，所以一定比較優。

## pD. 學徒
>有一個長度為 $n$ ($1 \leq n \leq 3\cdot 10^5$) 的序列，有以下兩種操作可以執行任意多次：
(1) 選擇兩個整數 $i,j$ 滿足 $1 \leq l < r \leq n, 0 < a_l$， $a_i:=a_i-1, a_j:=a_j+1$，花費是 $0$ 。
(2) 選擇一個整數 $i$ 滿足 $1 \leq i \leq n$，$a_i:=a_i+1$，花費是 $1$ 。
求讓整個序列元素都一樣的最小花費。

### Solution 1
注意到如果需要動用到第二種操作，那選擇 $i=1$ 永遠是最佳解。顯然，如果選擇 $j>1$ ，那一開始先對 $i=1$ 動用第二個操作，之後再動用第一種操作移到 $j$ 即可。

然後再注意到一件事：假設操作最後每疊有 $k$ 個盤子（不一定是最佳解），那 $k+1$ 也是可以達到的狀態。於是我們可以對 $k$ 進行二分搜，假設一開始有 $m$ 個盤子，那對 $i=1$ 進行第二個操作 $nk-m$ 次即可，答案也就是 $nk-m$。

至於給定一個 $x$，要怎麼判斷 $k=x$ 是可以達到的狀態呢？既然你已經知道最終狀態是每疊都有 $x$ 個盤子，那就先對 $i=1$ 進行第二個操作 $nx-m$ 次，然後 $\forall$ $1 \leq i \leq n-1$ ，把多餘的盤子移到 $i+1$ ，如果遇到一個時候盤子不夠就是不行，否則就可以。時間複雜度：$O(n\lg C)$。

### Solution 2
注意到對於原序列的每個後綴，盤子數量只增不減。同樣假設操作最後每疊有 $k$ 個盤子（不一定是最佳解），令 $s_k = \sum\limits_{i=k}^n a_i$，那答案至少要是 $x =\max\limits_{1 \leq i \leq n} \lceil \frac{s_i}{n-i+1} \rceil$ 。

事實上這個答案就是最佳解。構造解的方法可以仿照 Solution 1 中的解法：先對 $i=1$ 進行第二個操作 $nx-m$ 次，然後由後至前考慮每個元素，然後如果有少的盤子，把前面隨便一個盤子移過來就可以了。因為$\forall$ $1 \leq i \leq n$ , $s_i \geq (n-i+1)x$ ，因此不會發生盤子短缺的問題。時間複雜度：$O(n)$。

## pE. 夏日大矩陣
>給定一個 $n$ ，構造一個滿足下列條件的矩陣：
(1) 每個元素都介於 $1$ 到 $n$ 之間。
(2) 對於每個介於 $1$ ~ $n$  的正整數 $i$ ，如果 $i$ 在矩陣內出現至少一次，那每個 $i \times i$ 的子矩陣都含有至少一個 $i$。
(3) 矩陣內的元素種類需最大化。

### Solution
這題是構造題當然講開來就不值錢了(X

一件很神奇的事：如果題目改成對於每個介於 $1$ ~ $n$  的正整數 $i$ ，如果 $i$ 在矩陣內出現至少一次，那每個 $2^k \times 2^k$ 的子矩陣都含有至少一個 $i$，其中 $k$ 為最大的整數滿足 $2^k \leq i$，相信很多人都會做了，但是把條件放寬反而變難題了XDD

我的構造方法：對於每個 $i$，令 $k$ 為最大的整數滿足 $2^k|i$ ，那 $a_{i,j}=2^{k+1}+((j-1)\mod2^{k+1} )$ (1-indexed)。就這樣XD

## pF. 公平
>給定一個序列，把這個序列切成 $k$ 段，求每段各自加總後這 $k$ 段總和標準差最小值。對於每個 $1 \leq k \leq n$ 分別求答案。
>
小故事：這題原本的題目更複雜，雖然有 $O(n^3)$ 的解法但是麻煩到我也不想刻，就簡化成現在的樣子，結果發現跟大陸出的某題撞題了QAQ ([連結](https://www.cnblogs.com/mlystdcall/p/6743830.html)) 

### Solution
標準差這個東西看來很麻煩，但是如果你有好好上數學課的話這題應該就好解多了(?)

$\sigma = \sqrt{\frac{1}{m} \sum\limits_{i=1}^m (x_i - \mu)^2}=\sqrt{\frac{1}{m} \sum\limits_{i=1}^m x_i^2 - \mu^2}$

$\mu$ 可以很容易的求出來，所以現在問題變成給定一個 $k$ ，把序列切成 $k$ 段使得每段總和平方最小。

某些人應該就知道接下來怎麼做了(?)，如果還不瞭解可以繼續往下看。

我們嘗試使用DP。令 $p_i$ 代表前 $i$ 項的總和，$dp[i][j]$ 代表把前 $i$ 項切成 $j$ 段平方和的最小值。有一個很顯然的DP轉移式：

$dp[i][j]=\max\limits_{0 \leq k < i} dp[k][j-1]+(p_i-p_j)^2$

直接算複雜度是 $O(n^3)$ ，這樣很顯然是不夠的。但是我們可以把DP式變形：

$dp[i][j]=\max\limits_{0 \leq k < i} dp[k][j-1]+(p_i-p_k)^2$
$=p_i^2+\max\limits_{0 \leq k < i} (-2p_kp_i+p_k^2+dp[k][j-1])$

這裡就是一個標準的CHT(~~中華電信~~斜率優化)模型了，時間複雜度 $O(n^2)$ 。想學斜率優化以下提供教學連結：[連結](https://codeforces.com/blog/entry/63823)

## pG. 上車!
>有一台公車，這台公車從車站 $1$ 開到車站 $n$，有載客量限制 $k$。有 $m$ 個人要搭公車，第 $i$ 個人要從車站 $a_i$ 搭到車站 $b_i$。每個乘客可以選擇載或不載。求最大載客量(最大載客量定義請見原題)。
>
小故事：出題者是每天搭公車(精確來說是客運)上學的，每次司機提高載客量的方式都是greedy，但是就會發現有時候反而到某個時間點車上空空如也，就想到這題了><
然後發現又撞題了QQ ([連結](https://blog.csdn.net/u013480600/article/details/39051023))
### Solution
這題是min-cost flow的題目喔~

建模：
* $n$ 個節點
* $\forall$ $1 \leq i \leq n-1$ , $i$ 到 $i+1$ 容量 $inf$ ，費用 $0$
* $\forall$ $1 \leq i \leq m$ , $a_i$ 到 $b_i$ 容量 $1$ ，費用為 $a_i$ 到 $b_i$ 的距離的相反數。

節點 $1$ 到 $n$ 的 min-cost flow 變正號再除以 $1$ 到 $n$ 的距離就是答案了。我好像也不知道要說什麼了XD