新高一暑假第一期集訓恢復性訓練【樹狀陣列鞏固小練】
A. [POJ2182] Lost Cows
不難發現要從後往前確定每頭牛的身高,這樣每頭牛的身高就是 \(1\sim n\) 中沒被選過的第 \(a_i + 1\) 大的數(因為有 \(a_i\) 頭比自己矮),那麼我們只需用樹狀陣列維護一個 \(01\) 序列,沒選過的數標為 \(1\),每次查詢時二分 \(mid\),透過樹狀陣列 \(\operatorname{sum}(mid)\) 計算前 \(mid\) 個數有幾個為 \(1\) 即沒被選過的,直到找到 \(a_i+1\)。
B. [POJ1990] MooFest
先將二元組按照 \(v\) 從小到大排序,保證每頭牛比前面的牛的 \(v\) 大,計算它和它前面的牛的音量和的時候就可以直接用這頭牛的 \(v\),還需要計算出 \(|x_i - x|\) 之和。
樹狀陣列維護 \(x\),可以直接求出比這頭牛小的所有 \(x\) 之和,還需要用另一個樹狀陣列維護每個元素出現的次數,直接求出小於這頭牛的 \(x\) 的牛的數目。