POJ-3263 Tallest Cow
阿新 • • 發佈:2022-11-29
思路分析
(摘自這篇部落格)
這道題目一個核心要點,就是如何處理這些特殊的關係,也就是兩頭牛互相看見。
其實題目中已經告訴我們如何處理,因為我們發現,題目中要求牛的身高最高,那麼既然如此,我們完全可以將每一組關係(A,B),看作[A+1,B−1]這組牛身高只比A,B這兩頭牛矮1.
因此我們可以可以利用區間處理小操作,也就是字首和加差分。設一個數組D,D[i]為比最高牛矮多少,則D[P]=0,那麼對於一組關係,我們可以這樣操作,D[A+1]–,D[B]++;然後從左到右字首和,就可以求出矮多少。
參考程式碼
#include <iostream> #include <utility> #include <map> using namespace std; const int N = 1e4 + 10; int d[N]; map<pair<int, int>, bool> mp; // 用於去除重複區間,存在重複區間會導致多減1 int main() { int n, I, h, r; cin >> n >> I >> h >> r; while (r -- ) { int a, b; cin >> a >> b; if (a > b) swap(a, b); // 確保a小於等於b,方便之後差分 if (mp[pair<int, int>(a, b)]) continue; // 去除重複區間 mp[pair<int, int>(a, b)] = true; d[a + 1] --, d[b] ++; // 差分 } for (int i = 1; i <= n; i ++ ) { d[i] += d[i - 1]; cout << h + d[i] << endl; // 別忘記加上h } return 0; }