1. 程式人生 > 其它 >2021.10 好題

2021.10 好題

https://www.luogu.com.cn/training/2018

Avoid Rainbow Cycles

https://www.luogu.com.cn/problem/CF1408E

用最小代價刪除 \(\to\) 用最大代價保留

我們佈置一張新的星圖,有 \(n\) 個流星,代表著 \(n\) 個集合。如果元素 \(x\) 出現在 \(i\) 號集合,那麼將 \(x\) 號星辰和 \(i\) 號流星相連價值為 \(x+b_i\) 的無向絲線。

此時此刻,仰望星空,發現如果嶄新星圖亦有天體之環,那麼舊圖也將對應有環。所以讓我們精簡星圖,細剪連線,求出最大生成樹,即可。

Xor Tree

https://www.luogu.com.cn/problem/CF1446C

整活題解

那是代代相傳的處事真言:“如果不能剷除更多不如意,不如去保留更多的幸福。”

將每個數字代表的點化作星斗,那麼仰望星空,星圖上最多會有 \(n\) 條輕靈絲線。而我們需要遮蔽掉儘量少的星斗,也就是讓儘量多的星斗照耀,使得有且僅有一對星斗——牛郎織女星 \((i,j)\),互相都有 \(a_i\ \text{xor}\ a_j\) 為它們的最小值。依此法做,\(i\) 會指向 \(j\),且 \(j\) 會指向 \(i\),雙向奔赴,絲線重合,星圖上只有 \(n-1\) 條絲線,我們仰頭探望,便是樹狀星辰。

想到 \(\text{xor}\),思想的平原上便生長出一棵茂盛多枝的字典樹,而神妙的肥料就是我們插入的星斗數值 \(a_i\)

。我們在字典樹的 \(x\) 號點上刻上數字 \(f_x\),代表探索到 \(x\) 號點的瞬間,我們最優還能保留多少星斗,使多少星斗照耀。

那麼,刻畫的數字 \(f_x\) 滿足以下規律:如果 \(f_x\) 沒有左向的枝丫,那麼 \(f_x\) 就是右向的枝丫刻畫的數字;如果 \(f_x\) 沒有右向的枝丫,那麼 \(f_x\) 就是左向的枝丫刻畫的數字。

儘管如此,如果 \(x\) 既有左向的枝丫,又有右向的枝丫,那麼該如何是好?不要慌張,不要大意,我們僅需令 \(f_x\) 等於左向的枝丫刻畫的數字與右向的枝丫刻畫的數字的極大之值,再加上恆本之 “\(1\)” 即可。原因如下,如果左向枝丫、右向枝丫各只對應一個星斗數值,分別為 \(a_i,a_j\)

那麼這一對 \((i,j)\) 滿足條件。否則,例如左向枝丫刻畫之樹稍大,那麼我們可以保留全部的左向枝丫對應的星辰,再選一個右邊的星斗。設 \(x\) 的深度為 \(dep_x\),由於它們在二進位制下從高向低第 \(dep_x+1\) 位不同,所以右邊的星斗必不會與左邊的星斗滿足條件(左邊的星斗互相連顯然更優)。因此,當這棵字典樹上數字刻盡,再向上望去,必將也是一棵大樹——滿足題設的、長在星辰大海中的蒼天之樹。而擦拭汗水後,用 \(n\) 減去字典樹根節點的刻畫的數字(因為求的是最少遮蔽多少星辰,便是 \(n-f_{\text{root}}\)),便是我們將大聲呼喊出的,世間的最終真理。

正經題解

刪除最少 = 保留最多。

要使有且僅有一對 \((i,j)\),使得 \(a_i\text{ xor } a_j\) 是互相的最小值,這樣它們的邊就會重複。建立字典樹,設 \(f_x\) 為處理到字典樹點 \(x\) 的時候最多可以保留多少個數字。

\[f_x=f_{lson} , \text{ if no rson}\\ f_x=f_{rson} , \text{ if no lson}\\ f_x=\max(f_{lson},f_{rson})+1,\text{ otherwise} \]

最後一個轉移方程的意思是,如果左兒子 \(f\) 更大,那麼就保留左兒子。右兒子不可以選兩個以上,因為這樣就不止一對合法的 \((i,j)\)(左兒子中有,右兒子也有)。但是右兒子可以選一個,因為右兒子與左兒子的任意一個的 \(x_{dep}+1\) 位不同,肯定不會是互相的最小值(左兒子間的 \(x_{dep}+1\) 位是 0)。右兒子 \(f\) 更大,同理。

Happy New Year

https://www.luogu.com.cn/problem/CF1313D

發現 \(k\le 8\)。對於很小的資料,題解,居然,想到,狀壓

採用掃描線的思路,將區間們化作很多個端點們。設 \(f_{i,S}\) 為在第 \(i\) 個端點,包含這個端點的 \(k\) 個區間是否選擇的狀態,然後 dp 即可。到時候打程式碼的時候具體想想轉移方程。

Divide Square

https://www.luogu.com.cn/problem/CF1401E

發現答案貢獻來自兩個:

  1. 直接將矩形劈成兩半的線段數量 \(A\)
  2. 線段間交點數量 \(B\)。(每多一個交點,就會多一個矩形)

\(ans=A+B+1\)

重點在於計算 \(B\)。將橫向線段當做修改,縱向線段當做查詢,樹狀陣列即可。

Edge Weight Assignment

https://www.luogu.com.cn/problem/CF1338B

構造題,從點到根的所有邊入手。

Two Different

https://www.luogu.com.cn/problem/CF1408F

手操發現,答案似乎是:第一次 2 的倍數,第二次 4 的倍數……

題解上說遞迴 \((1,n)\) 分為 \((1,k),(k+1,n)\) 操作即可,其中 \(\log k\in \mathbb Z\)

Stoned Game

https://www.luogu.com.cn/problem/CF1396B

我考慮到,如果有一堆比其它所有堆之和還要多,那麼先手必贏。

然後就不會了2333。

題解是這樣說的,如果沒有上面的情況,那麼兩人輪流走,採取最優策略,是不會使得上面的情況發生的。模擬一下可知,如果一堆很多了,那麼肯定會去取這一堆,保障沒有讓對手必贏的情況。於是最後肯定會把石頭全部取完,判斷總石子奇偶性。

Chess Strikes Back

https://www.luogu.com.cn/problem/CF1379F1

https://www.luogu.com.cn/problem/CF1379F2

\(2n\times 2m\)\(n\times m\)

於是我們把棋盤劃分為許多個 \(2\times 2\) 的小矩陣。這些小矩陣必定是左上角和右下角白色。將矩陣分為四類:

  1. 兩塊都沒有被挖掉。
  2. 兩塊都有被挖掉。
  3. 左上被挖,右下保留。
  4. 右下被挖,左上保留。

如果小矩陣 3 的右下方有小矩陣 4(準確來說,如果小矩陣 3 座標 \((a,b)\),小矩陣 4 座標 \((x,y)\),那麼 \(a\ge x\ \and\ b\ge y\)),那麼就不合法了。

用線段樹維護 3 的最左位置和 4 的最右位置即可。