1. 程式人生 > 其它 >noip2021 訓練4 做題記錄

noip2021 訓練4 做題記錄

P3523 [POI2011]DYN-Dynamite

Description

Luogu傳送門

Solution

經典樹上 \(dp\)

首先二分 \(mid\) 表示最遠的距離。

\(f_{x}\) 表示距 \(x\) 最遠的未被覆蓋的關鍵點到 \(x\) 的距離,\(g_x\) 表示 \(x\) 到該子樹中的選定點的最小距離。

初值顯然:\(f_x = -inf\)\(g_x = inf\)

轉移方程:\(f_x = max \{ f_y + 1 \}\)\(g_x = max\{ g_y + 1\}\)

但是並不是所有的點都能被選,所以要分類討論一下:

  • \(f_x + g_x \leq mid\)
    ,可以直接覆蓋,\(f_x = -inf\)
  • \(f_x = mid\),此時選 \(x\),那麼 \(f_x = -inf\)\(g_x = 0\)\(ans++\)
  • \(g_x > mid\)\(d_x = 1\),這時就要扔給 \(fa_x\) 處理,所以 \(f_x = max\{ f_x, 0\}\)

P2324 [SCOI2005]騎士精神

Description

Luogu傳送門

Solution

\(IDA*\) 板子題,樂觀估價函式就是 \(5 \times 5\) 的目標矩陣和當前 dfs 到的矩陣中不同的點的個數。

爆搜即可。

P3205 [HNOI2010]合唱隊

Description

Luogu傳送門

Solution

經典區間 \(dp\)

\(f_{i,j}\) 表示選了區間 \([i,j]\) 且最後一個人從左邊進來的方案數,\(g_{i,j}\) 表示最後一個人從右邊進來的方案數。

轉移就很 easy 了:

\(f_{i,j} = f_{i + 1, j} \times (a_i < a_{i + 1}) + g_{i + 1, j} \times (a_i < a_{j})\)

\(g_{i, j} = g_{i, j - 1} \times (a_{j} > a_{j - 1}) + f_{i, j - 1} \times (a_j > a_i)\)

P2513 [HAOI2009]逆序對數列

Description

Luogu傳送門

Solution

看到名字,本來以為又是樹狀陣列維護什麼東西,結果不是……

看了一眼題解發現要 \(dp\) 一下子,\(dp\)\(dp\) 吧。

我們設 \(f_{i,j}\) 表示 \(i\) 的全排列中,逆序對數為 \(j\) 的個數。

我們考慮把 \(i\) 插入到 \(i - 1\) 的全排列中,列舉這次插入增加了 \(k\) 個逆序對。

那麼轉移方程就是:

\[f_{i, j} = \sum\limits_{k = max\{0, j - i + 1\}}^j{f_{i - 1, k}} \]

樸素的轉移是 \(O(n^2)\) 的,考慮優化。

優化也很簡單,發現 \(k\) 是從 0 開始列舉的,做個字首和即可。

P2592 [ZJOI2008]生日聚會

Description

Luogu傳送門

Solution

模擬賽上考了原題,還是比較 easy 的。

發現數據範圍還是很小的,考慮四維 \(dp\)

\(dp_{i, j, c1, c2}\) 表示安排了 \(i\) 名男生,\(j\) 名女生,且字尾男生數量減去女生數量最大是 \(c1\),最大字尾女生減男生數量是 \(c2\)

轉移就比較顯然了,用刷表法(邊界好處理一點)。

在最右邊安排一名男生:

\[dp_{i + 1, j, c1 + 1, max\{ 0, c2 - 1\}} += dp_{i, j, c1, c2} \]

安排女生同理。

P4295 [SCOI2003]嚴格N元樹

Description

Luogu傳送門

Solution

高精度板子

還是 \(dp\),設 \(f_i\) 表示深度不超過 \(i\) 的嚴格 \(n\) 元樹的個數。

轉移的過程相當於再增加一個根,且新建的根節點需要 \(n\) 個子樹。

那麼轉移方程就是:\(f_i = f_{i - 1}\, ^ n + 1\) (+1 就是隻有自己)

簡單吧,但是要用高精度(

P2607 [ZJOI2008]騎士

Description

Luogu傳送門

Solution

基環樹上 \(dp\) 板子。

(但是為什麼全機房除了我其他人都做過啊啊啊,果然還是我太菜了 \(QwQ\)

這道題給出的騎士之間的厭惡關係會形成基環樹(森林),那麼我們要在上面跑 \(dp\)

以下按一棵基環樹來討論。

我們先找到,然後選擇上面的一個點為根,跑樹形 \(dp\),然後再換成與它相鄰的一個點為根跑一遍樹形 \(dp\),取個最大值就是答案了(樹形 \(dp\) 最下面再說)。

我們再來考慮基環樹森林,其實是一樣的。

主函式裡列舉一遍所有的點,如果還沒遍歷過,就重複一次上述操作。

那麼樹形 \(dp\) 怎麼跑?類似於 沒有上司的舞會。

我們設 \(f_{x,0/1}\) 表示以 \(x\) 為根(\(x\) 選 或 不選)的子樹中最大戰鬥力。

轉移方程:

\[f_{x, 0} += max(f_{y, 0}, f_{y, 1}) \]\[f_{x, 1} += f_{y, 0} \]

P4035 [JSOI2008]球形空間產生器

Description

Luogu傳送門

Solution

高斯消元板子

不過還是要稍稍推一下式子的。

關於 \(n\) 維空間裡兩個點之間的距離題目下方的說明/提示裡有。

這道題給我們的都是表面上的點,言外之意,到球心距離相等。

假設我們要求的球心座標:\((x_1, x_2, x_3……x_n)\)

那麼有:\(\sum\limits_{i = 1}^{n}{\sum\limits_{j = 1}^n(a_{i,j} - x_j)^2 = C}\)

但是這是個二次方程,還有個常數怎麼辦啊?

上下一減就完了,減的過程就不寫了(懶得打字了),建議自己手推一下。

下面是化簡完的式子:

\[\sum\limits_{j = 1}^n2(a_{i,j} - a_{i + 1, j})x_j = \sum\limits_{j = 1}^n(a_{i, j}^2 - a_{i + 1, j}^2) \]

看著不清新?換元一下:

\[k_j = 2(a_{i, j} - a_{i + 1, j}) \]\[y_j = \sum\limits_{j = 1}^n(a_{i, j}^2 - a_{i + 1, j}^2) \]\[\sum\limits_{j = 1}^n(k_j \times x_j) = y_j \]

對這個式子建個增廣矩陣,跑個高斯消元就完了。

P2146 [NOI2015] 軟體包管理器

Description

Luogu傳送門

Solution

樹鏈剖分板子題,不多說了。

P2375 [NOI2014] 動物園

Description

Luogu傳送門

Solution

\(kmp\) 好題。但是講一次忘一次

大概就是不能暴力調 \(next\) 陣列,會被卡。

所以我們不用重置前一次跳到的座標,每次往後跳一格,判斷一下即可。

P4133 [BJOI2012]最多的方案

Description

Luogu傳送門

Solution

記憶化搜尋不解釋。

記錄一個斐波那契數列的字首和,每次跟當前搜尋到的要分解的數\(x\) 比一下。

如果 \(x > sum_{i - 1}\) ,當前位就必須選了,否則的話選或不選兩種情況都搜一遍。

P1640 [SCOI2010]連續攻擊遊戲

Description

Luogu傳送門

Solution

二分圖匹配好題。

觀察到每個物品只能用一次,即每次只用使用一個屬性值。

那麼我們把武器和屬性值連邊,從 1 開始列舉並跑匈牙利演算法。

如果無法匹配直接break(題意要求),然後輸出答案即可。

P1403 [AHOI2005]約數研究

Description

Luogu傳送門

Solution

不能理解為什麼是橙題……我怕不是連橙題都不會了……

通過打表發現,一段數的約數個數是一樣的,每次讓 \(i\) 等於 \(\frac{i}{n/i} + 1\) 中間的數整體算即可。

\[\_EOF\_ \]

本文來自部落格園,作者:xixike,轉載請註明原文連結:https://www.cnblogs.com/xixike/p/15549646.html