题目大意:

  • n头牛,给出最高的牛的高度和这头牛的下标
  • 给出m组A,B表示A能看到B
  • A牛能看到B牛必须满足:[A+1-B-1]之间的牛都严格小于A牛的高度,并且B牛大于等于A牛
  • 求每个牛的最大高度

题目分析(贪心+差分):

  • 首先,给出了最高牛的高度,为了取得最大高度就令所有牛的高度等于最大高度。
  • 然后,需要满足m组A,B的条件,把[A+1,B-1]等于A高度的都减去1,因为一开始每头牛高度都是一样的,所以就不用判断是否等于A,只用判断这个区间[l,r]是否已经减过.
  • 用差分数组来维护[A+1,B-1]-1这个操作,初始化差分数组为0,

代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>

using namespace std;

typedef pair<int,int> pii;

const int N = 1e4 + 10;

int n,idx,height,m;
int b[N];
map<pii,bool> vis;

int main(){
    cin >> n >> idx >> height >> m;
    for(int i = 1; i <= m; i ++ ){
        int l,r; cin >> l >> r;
        if(vis[{l,r}]) continue;
        if(l > r) swap(l,r);
        --b[l+1],++b[r];
        vis[{l,r}] = true;
    }
    for(int i = 1; i <= n; i ++ ){
        b[i]+=b[i-1];
        cout<<b[i]+height<<endl;
    }
    return 0;
}