1. 程式人生 > 其它 >HNOI 2018 Day2 題解

HNOI 2018 Day2 題解

Luogu4436 [HNOI/AHOI2018]遊戲

一次小 G 和小 H 在玩尋寶遊戲,有 \(n\) 個房間排成一列,編號為 \(1,2,\cdots,n\) ,相鄰的房間之間都有一道門。其中一部分門上鎖(因此需要有對應的鑰匙才能開門),其餘的門都能直接開啟。現在小 G 告訴了小 H 每把鎖的鑰匙在哪個房間裡(每把鎖有且只有一把鑰匙與之對應),並作出 \(p\) 次指示:第 \(i\) 次讓小 H 從第 \(S_i\) 個房間出發到 \(T_i\) 個房間裡。但是小 G 有時會故意在指令中放入死路,而小 H 也不想浪費多餘的體力去嘗試,於是想事先調查清楚每次的指令是否會存在一條通路。

你是否能為小 H 作出解答呢?

\(1\le n,p\le 10^6\)\(0\le m <n\)\(1\le x,y,S_i,T_i<n\) 保證 \(x\) 不重複。


  暴力

  比較正確的方法:https://www.cnblogs.com/C202044zxy/p/15815703.html

  但是,這題可以暴力地艹過去。

  記每個點最遠走到的點 \((L_i, R_i)\),然後每次暴力拓展,然後加個記憶化,據 Loj2397.「JOISC 2017 Day 3」幽深府邸 的官方題解說複雜度正確,為 \(\mathcal O(n\log n)\)不會證明。

  沒想到是個雙倍經驗題

Luogu4437 [HNOI/AHOI2018]排列

給定 \(n\) 個整數 \(a_1, a_2, \dots, a_n, 0 \le a_i \le n\),以及 \(n\) 個整數 \(w_1, w_2, \dots, w_n\)

\(a_1, a_2, \dots, a_n\) 的 一個排列 \(a_{p[1]}, a_{p[2]}, \dots, a_{p[n]}\)\(a_1, a_2, \dots, a_n\) 的一個合法排列,當且僅當該排列滿足:對於任意 的 \(k\) 和任意的 \(j\),如果 \(j \le k\),那麼 \(a_{p[j]}\) 不等於 \(p[k]\)。(換句話說就是:對於任意的 \(k\)

和任意的 \(j\),如果 \(p[k]\) 等於 \(ap[j]\),那麼 \(k<j\)。)定義這個合法排列的權值為 \(w_{p[1]} + 2w_{p[2]} + \dots + nw_{p[n]}\)

你需要求出在所有合法排列中的最大權值。如果不存在合法排列,輸出 \(-1\)

\(n \le 5\times 10^5\)


  貪心

  完了,基本貪心模型想了半天想不起來了,感覺最近要練習貪心技巧了。

  題面過於鬼畜,看了半天。

  為了方便思考,我們可以先 \(i \to p_i\) 連邊,\(1 \sim n\) 依次考慮選擇 \(p_i\),那麼當且僅當 \(a_{p_i}\) 已經有入邊(或者為 \(0\)),這條邊才是合法的。

  這個限制就是:

對於任意 \(k\)\(a_{k}\) 一定比 \(k\) 先選(假設我們第一個選的數是 \(0\))。

  於是我們可以將序列的關係轉化成圖的形式,對於每個 \(i\),有邊 \(a_i \to i\),然後每選一個點,它的所有出邊就都可以選擇了,然後,如果整個圖存在一個環,那麼就不能選完,於是無解,最後這個圖是一棵樹的結構,選擇一個點,必須先選其父親。

我沒有任何問題地推到了這裡,於是直接敲了一個很假的貪心上去,得了 \(20\) 分,然後發現這個轉化後的問題是一個比較經典的問題,再推了半年,還是不太會,然後只會優化一下判 \(-1\) 的條件,得了 \(30\) 分。

要是我夢迴 \(\tt HNOI2018\),我應該直接寄了。

  不扯了,但是之後確實是一個經典問題。

  我們可以對於整個點維護一個序列,表示選了這個點之後的選擇排列情況,然後每次選擇的時候,該點合併到父親所在的序列中,使得產生的貢獻最大。我們用 \((siz, tot)\) 表示一個序列的長度和權值和,考慮兩個序列,\((siz_1, tot_1)\)\((siz_2, tot_2)\),那麼 \(1\) 先於 \(2\) 選擇的條件是:

\[siz_1tot_2 > siz_2tot_1 \]

  然後可以用並查集維護每個點當前所在的序列位置,使用堆進行貪心選擇了。

  程式碼

Luogu4438 [HNOI/AHOI2018]道路

  貢獻提前計算板子題,不寫了。

本部落格作者:Werner_Yin(https://www.cnblogs.com/werner-yin/) ,轉載時請註明出處,謝謝支援!