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;
}
posted @ 2020-09-24 15:11  童年の波鞋  阅读(211)  评论(0编辑  收藏  举报