输入样例:
9 3 5 5
1 3
5 3
4 3
3 7
9 8
输出样例:
5
4
5
3
4
4
5
5
5
注意:
- 此题中给出的关系对可能存在重复
解析:
当两头牛可以看到,说明它们之间的距离最大为他们的高度减一,所以差分数组记录每头牛的变化。
注意可能有重复关系,需要去重。
每对关系,小的必须在前面,注意判断。
#include<bits/stdc++.h>
using namespace std;
const int N=5010;
int n,h,a[N],b[N],p,m;
set<pair<int,int>>cnt;
int main(){
scanf("%d%d%d%d",&n,&p,&h,&m);
for(int i=1;i<=n;i++){
a[i]=h;
b[i]=a[i]-a[i-1];
}
for(int i=0;i<m;i++){
int x,y;
scanf("%d%d",&x,&y);
if(abs(x-y)==1) continue;
if(x>y) swap(x,y); //小的放前面
if(cnt.count({x,y})) continue; //判断有无重复关系
cnt.insert({x,y});
b[x+1]-=1;
b[y]+=1;
}
int res=0;
for(int i=1;i<=n;i++){
a[i]=a[i-1]+b[i];
printf("%d\n",a[i]);
}
return 0;
}