c_aw_最高的牛(差分+区间处理)
当且仅当两头牛中间的牛身高都比它们矮时,两头牛方可看到对方。
现在,我们只知道其中最高的牛是第 P 头,它的身高是 H ,剩余牛的身高未知。
但是,我们还知道这群牛之中存在着 M 对关系,每对关系都指明了某两头牛 A 和 B 可以相互看见。
求每头牛的身高的最大可能值是多少。
方法一:差分
- 每头牛都要最高高度,所以两头牛之间的牛最优的情况是只比每个区间端点的牛矮1;
- 会不会存在两组之间交叉看到的情况呢?答案是不可能的,证明:有四头牛a、b、c、d:假设ac能相互看到,则a,c>b;bd互看,则b,d>c,这与第一点互斥了,所以不存在交叉看的情况;
- 题目给我们一个区间[a,b],我们就应该把区间[a+1,b-1]中的牛的高度都减去1,表示比最大高度小1;
注:1. 输入的两个数不保证升序;2. 且有重复输入,需要判重
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int mp[N], s[N];
int main() {
std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n,p,h,m; cin>>n>>p>>h>>m;
for (int i=0; i<m; i++) {
int a,b; cin>>a>>b;
if (a>b) swap(a,b);
if (mp[a]!=b) {
s[a+1]--, s[b]++;
mp[a]=b;
}
}
for (int i=1; i<=n; i++) s[i]+=s[i-1];
for (int i=1; i<=n; i++) cout<<(s[i]+h)<<'\n';
return 0;
}