1. 程式人生 > 實用技巧 >POJ3263 Tallest Cow 【差分,思維】

POJ3263 Tallest Cow 【差分,思維】

根據題目很容易想到,可以把初始身高都設定為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;
    }
}