1. 程式人生 > 其它 >2021洛谷11月月賽1遊記

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}\)

表示只考慮 \([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\)

。期望得分 \(5\) 分。

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