可以使用差分来写,每次输入a,b时,就减去它们之间的数,使它们比a,b小,这样才能达到a, bm相互看见
定义一个set< PII > height,避免有重复数字被多剪
一开始使第一个数组最大值h(这样就相当于把所以数都变成h),设有A,B,C,D四头牛,假设A和C能相互看见(height[A + 1] –, height[c] ++),则B和D不能相互看见,B不可能高于C去看D,不然一开始A,C比B高就不成立了,属于嵌套型,最后差分数组转化为正常数组
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
typedef pair<int, int> PII;
const int N = 10010;
int n, p, h, m;
int height[N];
int main()
{
cin >> n >> p >> h >> m;
height[1] = h;
set<PII> se;
for (int i = 0; i < m; i ++ )
{
int a, b;
scanf("%d%d", &a, &b);
if (a > b) swap(a, b);
if (!se.count({a, b}))
{
se.insert({a, b});
height[a + 1] --, height[b] ++;
}
}
for (int i = 1; i <= n; i ++ )
height[i] += height[i - 1], cout << height[i] << endl;
}