1. 程式人生 > 其它 >刷題記錄2022.3[2]

刷題記錄2022.3[2]

CF1580D Subsequence

\(\Rightarrow \rm luogu\) 連結

觀察減法部分,可以發現可以用笛卡爾樹+樹形揹包完成,每次合併節點 \(u\) 的兩個兒子的時候,假設物品數分別為 \(i,j\) ,那麼合併的答案顯然要減去 \(2ija_u\) (這裡乘二是因為每一對詢問兩次),如果要選上 \(u\) ,那麼還需要減去 \(a_u \times (2\times \text{除 } u \text{ 以外選擇的個數}+1)\)

[AGC009C] Division into Two

\(\Rightarrow \rm luogu\) 連結

首先設定 \(A>B\)

觀察性質,如果存在 \(i(1\leq i\leq n-2)\) ,有 \(a_{i+2}-a_i<B\) ,這時無論如何分 \(i,i+1,i+2\) ,都是不滿足條件的。因此此時答案為 \(0\)

接下來用 \(\rm dp\) 解決,設 \(f(i)\) 表示考慮了前 \(i\) 個元素,其中強制令 \(i\) 放入集合 \(A\) 。顯然這時候需要列舉上一個放入 \(A\) 的元素 \(j\) ,而這個 \(j\) 需要滿足下面的條件:

  • \(a_i-a_j\ge A\)
  • \(\forall{p\in[j+1,i-2]\cap \mathbb{Z}}, a_{p+1}-a_p\ge B\)

第一個條件顯然限制了 \(j\) 的最大值,而第二個條件限制了 \(j\) 的最小值,用字首和維護一下 \(f\) 即可。

CF1299D Around the World

\(\Rightarrow \rm luogu\) 連結

首先將和節點 \(1\) 相關的邊都刪掉,這樣會有若干個聯通塊。

如果聯通塊和 \(1\) 只有一條邊相連,因為路徑權值是異或和,對聯通塊設一個線性基,接下來找到一顆生成樹,然後將僅含一條非樹邊的環加入這個聯通塊的線性基中,可以認為任何一條從 \(1\) 到某個點然後再回到 \(1\) 的人和路徑(包括不簡單路徑)都可以用樹上路徑配合若干個先前提到的環組成。(這個套路來自\(\text{CF938G Shortest Path Queries}\)

),而因為要回到 \(1\) ,所以樹上路徑的權值和為 \(0\) ,因此只需要看是否存在一些環是線性相關的。如果存在一些線性相關,那麼這個聯通塊顯然不能選。

如果聯通塊和 \(1\) 有兩條邊相連,那麼實際上有兩種情況:

  • 選擇其中一條邊,可以發現這時候和先前完全一樣,而且線性基和選擇哪一條邊無關。
  • 選擇兩條邊,那麼這時候實際上是線上性基中加入了一個三元環(題目說只有三元環)。同理,這個三元環不能和之前的環線性相關。

接下來可以選擇一些聯通塊,這個似乎做不了,因為線性基的數量過多?但是很多線性基實際上是一樣的,將線性基消成最小的(將若干二進位制數拼起來之後字典序最小),發現這時候只有不到 \(400\) 個不同線性基,那麼就可以 \(\rm dp\) 了,要先預處理出兩個線性基合併之後得到的線性基作為轉移。

\(\Rightarrow \texttt{Code}\)

[HAOI2011]problem a

\(\Rightarrow \rm luogu\) 連結

將每個人的資訊 \((a_i,b_i)\) 轉化一下,就是和他相同分數的區間為 \([a_i+1,n-b_i]\)

將相同的區間合併一下,合併之後的人數設為這個區間的權值 \(w[l,r]\) ,問題轉化一下:選擇不相交的若干區間,令選擇的區間的權值和最大,這時候可以將區間按右端點排序,設 \(f(i)\) 表示考慮了前 \(i\) 個區間,強制選擇第 \(i\) 個區間的最大權值和,那麼有:

\[f(i) = \max_{j<i\wedge r_j<l_i}\{f(j)+w[l_i,r_i]\} \]

特別的,令 \(l_0=0,r_0=0\)