標籤裡的 dp 是騙人的,根本沒有 dp ,主要思維難度在於乙個轉化,題面開始看上去很嚇人,選取轉化題意就是給定乙個序列,每次可以選取兩個相同的數,在兩者之間選取任意個數消去,問最多能消去多少數。
第一想法,選取到兩個數後將之間的所有數都消去會比較優,事實上確實如此,但是如果消去的數之後能與別的數組成區間將中間的別的數消去就虧了,所以想到在這裡 dp ?
但事實上並不是這樣。
有幾個顯然的性質,首先相同的數隻選最左邊和最右邊的組成區間,不用擔心這兩個端點被消去,在消去之前完成操作就可以了,所以將所有相同的數中最大的區間全部取出來,組成乙個集合,則這個集合任意兩個端點都不會重疊。
其次如果乙個區間被更大的區間包含,這個區間一定是無用的,這點更顯然。
最後得到的就是乙個區間集合,滿足沒有包含關係,再將沒有交集的區間分開,就將所有區間分成了幾部分,每部分互不相關。
最後一步,每個部分取最優結果,首先,整個區間內所有不是端點的肯定全部消去,這點毋庸置疑,重點是端點消去哪些。
假設我們已經確定一些區間要選取,那麼這些區間的端點會剩下幾個呢?簡單貪心得到所有區間的右端點都剩下,還有第乙個區間的左端點。
也就是說最後要選取最少個數區間將整個區間覆蓋,這個就是模板了。
**
Codeforces練習筆記2
不難發現,對於乙個聯通塊內的點,顯然是 b 權值越大的在越前,而且整體而言能向前則向前 對於乙個點加入到乙個聯通塊中,只要查詢聯通塊內有幾個點的權值大於 小於 它,對應的加加減減即可 問題是加入乙個點時可能聯通兩個聯通塊,這就很痛苦了。這種塊塊的合併多數使用線段樹合併進行維護,有點類似於 pkuwc...
codeforces口胡記錄
題意 2d平面上給出若干條垂直或水平的線段,求共構成了幾個封閉的矩形。題解 大概就是先把每行每列先做乙個簡單的線段處理 處理成若干連續段 然後維護乙個從下往上的掃瞄線,並且在掃的時候對每個橫座標維護在它上面是否有連續的豎直線段,對於每個橫線段 長度為1,即兩個橫座標之間 維護在當前的掃瞄線下,是否有...
codeforces 1114F 線段樹練習
這是一道用線段樹維區間值的一道題,題意很簡單,就是對於給定的乙個序列,初始時每個數的值不大於300,然後有兩中操作,乙個是對區間 l,r 的每個數乘上以個數x,乙個是詢問區間的乘積的尤拉函式值,首先對於第乙個操作顯然可以用線段樹的延遲更新來完成,對於第二個操作,我最先沒考慮資料,就想著直接維護區間的...