POJ3263 Tallest Cow 【差分,思維】
阿新 • • 發佈:2020-10-10
根據題目很容易想到,可以把初始身高都設定為H,A能看到B的話,只需要把[A+1,B-1]裡面的牛身高都減一就可以啦~
但現在就存在一些問題:若A可以看到B,那麼A的身高必須要<=B,而且中間的牛也可能會比A高,只是-1不可行,怎麼辦呢?
實際上,A的身高本來就必定不可能大於B。因為兩對A_x,B_x不能存在交叉,只能像括號序列一樣一一匹配。所以既然不可能會有不同的A_x,B_x對跨過當前的AB,那麼他們的最大高度一定是相同的。同理,[A+1,B-1]裡面也是隻能比A低不能比A高,所以就可以放心地差分啦~
#include <map> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 10000 + 5; int n, I, H, r, sum[N]; map <pair <int, int>, bool> _exist; int main () { // freopen ("data.in", "r", stdin); cin >> n >> I >> H >> r; sum[1] = H; while (r--) { int x, y; cin >> x >> y; if (x > y) swap (x, y); if (_exist.count(make_pair (x, y))) { continue; } _exist[make_pair(x, y)] = true; sum[x + 1] -= 1; sum[y] += 1; } cout << sum[1] << endl; for (int i = 2; i <= n; ++i) { // cout << "sum[" << i << "] = " << sum[i] << endl; sum[i] += sum[i - 1]; cout << sum[i] << endl; } }