101-最高的牛
题目描述
关系
内容
有
当且仅当两头牛中间的牛身高都比它们矮时,两头牛方可看到对方。
现在,我们只知道其中最高的牛是第
但是,我们还知道这群牛之中存在着
求每头牛的身高的最大可能值是多少。
输入格式
第一行输入整数
接下来
输出格式
一共输出
第
数据范围
输入样例:
9 3 5 5
1 3
5 3
4 3
3 7
9 8
输出样例:
5
4
5
3
4
4
5
5
5
注意:
- 此题中给出的关系对可能存在重复
问题分析
最初思路
可以发现假如我们有关系 M,表明
我们更加倾向于从最高的牛开始考虑。先找到距离 P 最远的关系 R,假设 P 为 3,R 为 1,
同样,若 R 为 7,且那么
特别的,如果关系是相邻的,那么就为最大高度 5.
对于每一个位置 x 的最大高度就是区间
故而,所以跨越 P 位置的关系都是不可能存在的。我们应该对所有跨越 P 的关系不处理。
最开始,所有位置的最大高度为 5。
思路分析
执行流程设计
- 初始化差分数组 b 为 5.
- 遍历所有的关系,假设关系为
: - 如果
,那么就不处理; - 如果不是上述情况,就对区间
执行区间减 1 操作;
- 如果
- 生成最后操作的数组,就是最后的答案;
总结
代码实现
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int, int> pii;
typedef long long ll;
const int N = 5010, H = 1000010, M = 10010;
int n, p, h, m;
int b[M];
set<pii> re;
int main()
{
cin >> n >> p >> h >> m;
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
if (a > b) swap(a, b);
re.insert({a, b});
}
b[1] = h;
for (auto v: re) {
int d = v.y - v.x - 1;
if (d > 0 && (v.y <= p || v.x >= p)) {
b[v.x + 1] += -1;
b[v.y] -= -1;
}
}
ll s = 0;
for (int i = 1; i <= n; i++) {
s += b[i];
cout << s << endl;
}
return 0;
}