A
定義兩個元素互不相同的序列相似,當且僅當離散化後的排列相同。給定 \(0\sim n - 1\) 的排列 \(a\),其中有些位置空缺。你需要填寫排列 \(a\),最大化 \(k\) 的個數滿足對於任意長度為 \(k\) 的子序列,滿足互不相似。
\(n\le 20\)
給定 \(a,k\),先考慮如何判定。猜結論:對於任意 \(i,j\) 滿足 \(|a_i - a_j| + |i - j|\ge k + 2\)。欽定 \(i < j, a_i < a_j\),我們可以刪掉 \(a_{i + 1\cdots j - 1}\),以及值域在 \(a_i + 1 \sim a_j - 1\) 的所有數,最後刪掉 \(a_i\) 或 \(a_j\) 都是等價的。即只要刪的數的個數 \(\le k\) 則不合法。
然後難以狀壓。考慮直接爆搜剪枝,發現可以透過。
- 啟示:猜結論要大膽;爆搜剪枝。
B
有 \(n\) 種物品,每個物品有體積 \(w_i\) 和價值 \(v_i\)。有一個空的揹包,你每次可以選擇一個物品放進揹包,求最終放滿揹包時,揹包內所有物品價值總和最大值,以及達成最大值的方案數(選物品先後順序之分),答案對 \(1092515507\) 取模。共 \(m\) 次詢問,每次給出固定的揹包容量 \(q_i\)。
\(n, m, q, w_i\le 100, \ q_i, v_i \le 10^9\)
考慮矩陣快速冪,存一個二元組 \((a, b)\) 表示最大值以及達成最大值的方案數。矩陣快速冪完美契合了選物品有順序的方案數限制,以及放滿揹包的限制。
C
有 \(n\) 個鼓和 \(m\) 個獎勵,第 \(i\) 個獎勵為:在第 \(k_i\) 次選擇第 \(x_i\) 個鼓打時,有 \(w_i\) 的收益。設當前已經打過的鼓的編號為 \(l\sim r\),那麼下一次可以選擇第 \(l - 1\) 個或第 \(r + 1\) 個鼓打。有 \(q\) 次詢問,每次給出 \(s_i\) 表示第一次打的鼓的編號,求最大總收益。
\(1\le n\le 10^9, \ 1\le m, q\le 5\times 10^5\)
考慮每個獎勵 \((k, x, w)\),我們劃分為兩個區間 \([x - k + 1, x]\) 和 \([x, x + k - 1]\)。對於 \([x - k + 1, x]\),當打完了 \([x - k + 1, x - 1]\) 後打 \(x\) 時會有收益,\([x, x + k - 1]\) 同理。有收益的區間一定是呈一條包含關係的鏈,考慮 dp,按左端點遞增、右端點遞減對區間排序:設 \(f[i]\) 表示連結到了第 \(i\) 個區間的答案。
每次可以用樹狀陣列最佳化轉移。最終要求支援對一段區間內的 \(s\) 進行答案 chkmax,可以 動態開點標記永久化線段樹 / 掃描線 + 可刪堆 解決。
D
一棵 \(n\) 個點的樹,初始時你需要安排一些人在任意節點上,一個人透過第 \(i\) 條邊有對應時間 \(t_i\)。有 \(m\) 個任務,第 \(i\) 個任務為 \((a_i, b_i, c_i)\),表示在 \(a_i\) 時刻需要聚集至少 \(b_i\) 個人於 \(c_i\) 節點。求完成所有任務的最小總人數。
\(n, m\le 10^5\)
一個任務向完成該任務的人能夠完成的下一個任務連邊,形成一張 DAG,答案即為 DAG 最小帶權鏈覆蓋。運用 Dilworth 定理,轉化為求最大帶權反鏈。可以 dp,設 \(f[u, i]\) 表示