2021洛谷11月月賽1遊記
才打了 \(200 \ pts\),退步了。
\[\rm 【LGR-096】洛谷~11~月月賽~I~ \]Prob A. Addition (Statement)
有一個初始長度為 \(n\) 的序列 \(a\)。你需要進行 \(n − 1\) 次操作。每一次操作先選出兩個相
鄰的數 \(x, y\) 並刪掉(原序列中 \(x\) 在 \(y\) 左邊),再往原位置插入一個 \(x + y\) 或一個 \(x − y\)。求
\(n − 1\) 次操作之後能最終剩下的數的最大值。\(1 ≤ n ≤ 10^5\), \(|ai| ≤ 10^9\)。
分值 | \(n\) | \(abs(a_i)\) |
特殊性質 | |
---|---|---|---|---|
\(Subtask\ 1\) | \(10\) | \(\leq 2\) | 無特殊限制 | 無 |
\(Subtask\ 2\) | \(20\) | \(\leq100\) | 無特殊限制 | 無 |
\(Subtask\ 3\) | \(5\) | 無特殊限制 | 無特殊限制 | \(a_i \ge 0\) |
\(Subtask\ 4\) | \(30\) | 無特殊限制 | \(\leq 1\) | 無 |
\(Subtask\ 5\) | \(35\) | 無特殊限制 | 無特殊限制 | 無 |
Subtask 1
輸出 \(\max(a_1 + a_2, a_1 − a_2)\)。期望得分 \(10\) 分。
Subtask 2
區間 dp
,\(f_{l,r}, g_{l,r}\)
列舉 \(i\) 表示最後一次合併的位置,容易得出轉移方程式:
$$f_{l,r} = \max\limits_{i-1}^{r-1}{f_{l,i} + f_{i+1,r}, f_{l,i} − g_{i+1,r}}$$
$$g_{l,r} = \min\limits_{i-1}^{r-1}{g_{l,i} + g_{i+1,r}, g_{l,i} − f_{i+1,r}}$$
時間複雜度 \(\mathcal{O}(n^3)\)。期望得分 \(30\) 分。
Subtask 3
輸出 \(\sum\limits_{i=1}^{n}a_i\)
Subtask 4
輸出 \(a_1 + \sum\limits_{i=2}^{n}|ai|\)。
依次加入每一個數,假設當前答案是 \(x\),新加入的數是 \(w\)。
如果 \(w < 0\) 則 \(x− = w\)。否則 \(x+ = w\)。
顯然這樣可以得到最大答案。時間複雜度 \(\mathcal{O}(n)\)。
Prob B. Lines (Statement)
平面直角座標系中有 \(n\) 條直線,任意 \(3\) 條直線不交於一點且沒有兩條直線重合。現在
這些直線形成了不超過 \(\frac{n(n − 1)}{2}\) 個交點,請你求出至少選取其中幾條直線才能覆蓋到所
有交點。\(1 ≤ n ≤ 10^5, |a|, |b|, |c| ≤ 10^9\)。
分值 | \(n\) | 特殊性質 | |
---|---|---|---|
\(Subtask\ 1\) | \(10\) | \(\leq20\) | 無 |
\(Subtask\ 2\) | \(30\) | \(\leq100\) | 無 |
\(Subtask\ 3\) | \(10\) | 無特殊限制 | \(ab=0\) |
\(Subtask\ 4\) | \(50\) | 無特殊限制 | 無 |
Subtask 1
暴力列舉每一條直線是否選擇,判斷是否合法。期望得分 \(10\) 分。
Subtask 2
假設 \(a = 0\) 的有 \(t\) 條。輸出 \(\min(t, n − t)\)。期望得分 \(10\) 分。
Subtask 3
沒有刪掉的直線一定是互相平行的,否則一定有至少一個交點沒有被刪掉。所以其實就是
要選出最多的直線使它們兩兩平行。
對於每一條直線暴力找出有多少條直線與它平行,取最大值即可。
時間複雜度 \(\mathcal{O}(n^2)\) 或 \(\mathcal{O}(n^2 \log n)\)。期望得分 \(40\) 分。
Subtask 4
對斜率排序或用 map
統計。時間複雜度 \(O(n \log n)\)。期望得分 \(100\) 分。
C. ABC (Statement)
給定一個長度為 \(n\) 的只包含 A, B, C
的字串 \(S\),你可以進行若干次操作,每次操作為:
-
先選擇一個區間 \([l, r]\),你需要保證 \(1 ≤ l ≤ r ≤ n\)。
-
再選擇三個字元 \(pA, pB, pC \in {A, B, C}\),並將 \(S_{l...r}\) 中所有
A
變為 \(pA\),所有B
變為 \(pB\),
所有C
變為 \(pC\),\(pA\), \(pB\), \(pC\) 可以相等。你的目標是用最小的運算元使得任意相鄰兩個字元不同。要求構造方案。
\(1 ≤ n ≤ 5 × 10^3\)。
Subtask 1
輸出 \(0\)。期望得分 \(1\) 分。
Subtask 2
暴搜。期望得分 \(20\) 分。
Subtask 3
把所有偶數位置改為 B
。期望得分 \(10\) 分。
Subtask 4 ∼ 6
假設 \(a_i = a_{i+1}\) 的位置個數為t,顯然答案 \(\ge \left\lceil \frac{t}{2} \right\rceil\) 考慮構造方案達到這個下界。
對於每一個 \(a_i = a_{i+1}\) 的位置在 \(i\) 與 \(i + 1\) 之間切一刀,最終將序列分出 \(t + 1\) 段。
對於所有編號為偶數的段執行一次 \(pA =\) B
, $pB = $ C
, $pC = $ A
的操作。
因此操作次數是 \(\left\lfloor \frac{t+1}{2} \right\rfloor= \left\lceil \frac{t}{2} \right\rceil\),達到下界,正確性顯然。
時間複雜度 \(\mathcal{O}(n)\)。期望得分 \(100\) 分。
D. Permutation (Statement)
對於一個 \(1 \sim n\) 的排列 \(p\),定義 \(G_p\) 為使用以下方法構造出來的無向圖:
-
對於每一個 \(i \in (1, n]\),找到最大的 \(j \in [1, i)\) 滿足 \(p_i > p_j\),然後連一條 \(i, j\) 之間的邊,
如果不存在這樣的 \(j\) 則不連。給定一棵有 \(n\) 個節點的樹T。把 \(p\) 稱為好排列當且僅當 \(G_p\) 與 \(T\) 同構。如果存在好排
列,輸出其中字典序最大的一個。否則輸出 \(−1\)。\(1 ≤ n ≤ 5 × 10^3\)。
分值 | \(n\) | 特殊性質 | |
---|---|---|---|
\(Subtask\ 1\) | \(15\) | \(\leq 8\) | 無 |
\(Subtask\ 2\) | \(5\) | 無特殊限制 | 樹退化為一條鏈 |
\(Subtask\ 3\) | \(15\) | 無特殊限制 | 度數 \(≥ 3\) 的節點個數 \(≤ 1\) |
\(Subtask\ 4\) | \(20\) | \(\leq 100\) | 無 |
\(Subtask\ 5\) | \(20\) | \(\leq 10^3\) | 無 |
\(Subtask\ 6\) | \(25\) | 無特殊限制 | 無 |
Subtask 1
暴力列舉排列,構造樹,判斷同構。期望得分 \(15\) 分。
Subtask 2
\(ans_1 = 1, ans_2 = n, \forall i \in (2, n], ans_i = i − 1\)。期望得分 \(5\) 分。
Subtask 3
設每一條鏈的長度為 \(a_{1...m}\)。不妨 \(\forall i \in [1, m), a_i ≤ a_{i+1}\)。
\(ans_1 = 1, ans_2 = n, \forall i \in (2, a_i + 1], ans_i = i − 1\)。
依次考慮 \(j = 2 \sim m\)。對於一個 \(j\),假設 \(x = \sum\limits_{k=2}^{j} a_k\)。
依次往 \(ans\) 中加入 \(n − x \sim n − x + a_j − 1\)。期望得分 \(20\) 分。
Subtask 4 ∼ 5
先列舉根。令 \(f_u\) 表示 \(u\) 這棵子樹可以對應到的字典序最大的答案,\(w_u\) 表示 \(u\) 對應的 \(p\) 值,
\(size_u\) 表示 \(u\) 子樹的大小。
結論
每一棵子樹在 \(p\) 中的下標一定對應一段區間。
證明:
如果不是,假設 \(v\) 不在 \(u\) 的子樹中但是插在了 \(u\) 的子樹的中間。
此時一定有 \(w_u > w_v\),否則 \(v\) 就是 \(u\) 子樹中的點了。
但是出現在 \(v\) 之後第一個本應在 \(u\) 子樹中的點一定不能連到 \(u\) 的子樹中,矛盾。
我們考慮計算出每一個 \(f_u\)。假設所有 \(v \in son_u\) 的 \(f_v\) 都已經計算好了。
首先 \(f_{u,1} = 1\),否則一定不是一棵樹。
把所有 \(v \in son_u\) 的 \(f_v\) 按 \(|f_v|\) 第一關鍵字從小到大, \(f_v\) 字典序第二關鍵字從大到小排序。
然後把所有 \(f_v\) 依次插入 \(f_u\)。容易發現這樣可以使得 \(f_u\) 字典序最大。
時間複雜度 \(\mathcal{O}(n^3)\) 或 \(\mathcal{O}(n^3 log n)\)。期望得分 \(35 \sim 55\) 分。
Subtask 5 ∼ 6
上面直接列舉根暴力太慢了,我們可以考慮換根。
設 \(g_u\) 為 \(u\) 的外子樹的字典序最大的答案。
那麼從 \(g_u\) 轉移到某個兒子只需要按之前的排序方法找到 \(g_u\) 在 \(v \in son_u\) 的 \(f_v\) 中位置即可。
時間複雜度 \(\mathcal{O}(n^2)\) 或 \(\mathcal{O}(n^2 log n)\)。期望得分 \(55 \sim 100\) 分。
本文來自部落格園,作者:蒟蒻orz,轉載請註明原文連結:https://www.cnblogs.com/orzz/p/15487385.html