题目链接:101. 最高的牛 - AcWing题库
思路:
可以先假设,所有牛都一样高。
当得到一组牛可以相望时,可以将他俩中间的牛的高度都减去1,这样就可以保证他俩可以相望。
利用差分数组可以很好计算。
注意点:有数据点有重复相望的牛,如果对重复的数据都进行操作的话,就会导致他俩中间的牛最大高度会被多减去一个1,因此在操作前要先判重。
代码:
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
const int N = 5005;
int a[N],b[N];
int n,m,p,h;
int l,r;
set<pair<int,int>>existed;
int main()
{
cin>>n>>p>>h>>m;
for(int i=1;i<=m;++i)
{
cin>>l>>r;
if(l>r) swap(l,r);
if(!existed.count({l,r}))
{
existed.insert({l,r});
b[l+1]--;
b[r]++;
}
}
for(int i=1;i<=n;++i) b[i]+=b[i-1];
int dis=h-b[p];
for(int i=1;i<=n;++i)
{
cout<<b[i]+dis<<endl;
}
return 0;
}