IOI2021 集訓隊作業



A (WF         2014) : A B C E F G H I J K L (HJL)
B (WF         2015) : B E G H J K L M (B)
C (WF         2016) : A B D F H I J K M (HIJ)
D (WF         2017) : A B D G H J K L (AHJ)
E (WF         2018) : C D E G H I J (CEGIJ)
F (WF         2019) : B C F G I J K (BCF)
G (NEERC      2017) : F G H I J K L (FH)
H (NEERC      2016) : B C D G I K L M (I)
I (NEERC      2015) : B C D H I J K L (H)
J (NEERC      2014) : C D E G H I (CD)
K (NEERC      2013) : A C D E G H I K (CEG)
L (CERC       2017) : B C D E I K L (CE)
M (CERC       2016) : B D E G I J L (GI)
N (CERC       2015) : C E F G I J L ()
O (CERC       2014) : A B E G J K L ()
P (CERC       2013) : A D E G H J ()
Q (NEERC,NSub 2017) : C D E F G H J ()
R (NEERC,NSub 2016) : B D E G H I J ()
S (NEERC,NSub 2015) : D F G I K (K)
T (NEERC,NSub 2014) : C E F H K (CH)
U (NEERC,NSub 2013) : C H I J L (L)


目前 AC 數目 : 115


\(\texttt{#209. Intrinsic Interval}\)

簡要題意

給一個 \(1-n\) 的排列 \(a_1 a_2 \cdots a_n\) . 定義一個區間為本原連續段當且僅當這個區間排序之后是連續的一段.

有 m 次詢問,每次詢問一個 \(l_i\) \(r_i\) 查詢包含它的最小本原連續段。

\(1\leq n \leq 10^5\)\(1\leq m \leq 10^5\)

Solution(離線做法)

一個區間合法的條件是 \(max-min=r-l\) , 並且不難證明本原連續段要么包含要么不交

由於 \(val = max-min-(r-l) \geq 0\)

所以可以在線段樹上記 \(val\) 的最小值以及最小值的出現次數 , 這個可以用單調棧 + 線段樹 \(\Theta(n\log n)\) 維護。

用一個 \(set\) 記錄詢問,以 \(l\) 為關鍵字,在掃描到 \(r\) 的時候在 \(set\) 中加入詢問並處理詢問即可。

復雜度 \(\Theta((n+m)\log n + m\log m)\) , 需要離線。

有析合樹做法,但是還沒寫。


\(\texttt{#173. Equal Numbers}\)

簡要題意

給定一個長度為 \(n\) 的整數數列 \(a_1 a_2 \cdots a_n\) 你可以執行如下操作:選擇一個 \(a_i\),並把它乘以任何正整數。

你的任務是對於每個 \(k(0\leq k\leq n)\) 計算:給數列執行 \(k\) 個操作后,數列中包含的數字種類數的最小值。

\(1\leq n \leq 3\times 10^5\)\(1\leq a_i \leq 10^6\)

Solution

\(c_x\)\(x\) 這個數字在數組中的出現次數 .

考慮什么樣的操作能使得當前數字種類數減去 \(1\) .

1、找兩種不同的數 \(x\)\(y\) , 把 \(x\)\(y\) 合並成一個新的種類 \(z\) , 並且這個種類 \(z\) 可以是任意數 , 需要 \(c_x + c_y\) 次操作 , 操作后 \(c_z = c_x + c_y\) , \(c_x = 0\) , \(c_y = 0\) .

2、找兩種不同的數 \(x\)\(y\) , 滿足 \(y\)\(x\) 的倍數 , 把 \(x\) 合並到 \(y\) 上去 , 需要 \(c_x\) 次操作 , 操作后 \(c_y += c_x\) , \(c_x = 0\) .

不難發現要么一開始就用了 \(1\) 操作之后一直把其它類別合並到這個 \(1\) 操作產生的 \(z\) 上 (因為 \(z\) 可以是任何數 , 所以令 \(z\)\(1 \cdots 10^6\)\(lcm\) 即可) ,要么是只用操作 \(2\) .

那么這兩種方法分別貪心即可。復雜度 \(\Theta(m\ln m + n)\) , 其中 \(m = \max\limits_{i=1}^{n} a_i\)


\(\texttt{#177. Outer space invaders}\)

簡要題意

\(n\) 個區間 \([a_i,b_i]\) , 每個區間有一個值 \(d_i\) .

你可以在某些位置上放數字(只能放正整數) , 需要保證對於每個 \(i\) 區間 \([a_i,b_i]\) 內都至少有一個位置放了一個 \(\geq v_i\) 的數字 , 最小化放的數字的大小的和。

多組數據 , \(1\leq a_i < b_i \leq 10^4\) , \(1\leq d_i \leq 10^4\) , \(n \leq 300\) , \(\sum n^3 \leq 2.5 \times 10^8\)

Solution

首先對所有 \(a_i\)\(b_i\) 放到一起離散化 , 這樣坐標范圍就縮小到 \(\Theta(n)\) 級別.

\(dp_{l,r}\) 表示被包含在區間 \([l,r]\) 內的所有區間的限制都滿足的情況下 , 最小的放的數字的大小之和。

轉移的時候枚舉這個區間內 \(d_i\) 最大的區間的 \(d_i\) 放在什么位置即可 , 單組數據復雜度 \(\Theta(n^3)\) , 總復雜度 \(\Theta(\sum n^3)\)


\(\texttt{#294. Gangsters in Central City}\)

簡要題意

給你一棵 \(n\) 個點的樹,樹的葉子節點是房屋,樹根是供水系統的中心。

有一些點被占據了,你要斷掉一些邊使得被占據的點到不了樹根,並且最小化斷邊條數,在最小化斷邊條數的情況下最小化到不了樹根的點的個數。

有時候一個點會被占據或者取消被占據狀態,有 \(q\) 個操作,每次操作后都要輸出答案。

Solution

不難發現,最優方案顯然是對於根的每個子樹取它的 \(lca\) , 將 \(lca\) 到它父親的邊斷掉。

直接維護每個子樹內部點的 \(lca\) 即可,復雜度 \(\Theta((n+q)\log n)\)



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM