题目大意:
- 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;
}