1. 程式人生 > 其它 >POJ-3263 Tallest Cow

POJ-3263 Tallest Cow

思路分析

(摘自這篇部落格)

這道題目一個核心要點,就是如何處理這些特殊的關係,也就是兩頭牛互相看見。
其實題目中已經告訴我們如何處理,因為我們發現,題目中要求牛的身高最高,那麼既然如此,我們完全可以將每一組關係(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;
}