题解:
- 想象一下,假如x,y(p<x<y)两牛可以看见对方,那么x+1到y-1的高度至少比min(x,y)小才行,由于最高点p在x左边,
- 那么x+1最大高度要比x小1,但y以及其之后的牛不受这条关系的影响,所以我们得想办法让前面的-1效果不影响,这就
- 想到差分。
- 具体做法就是,(1)p<=x<y ,b[x+1]-- , b[y]++。 (2) x<y<=p , b[y-1]-- , b[x]++;
- 注意:输入关系有重复,要标记,由于卡内存,所以用哈希的方法。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MA=1e4+5;
map<int,int>mp;
int n,p,h,m,cnt=0;
int b[MA];
int main()
{
scanf("%d%d%d%d",&n,&p,&h,&m);
while(m--){
int x,y;
scanf("%d%d",&x,&y);
if(mp[x*10000+y]) continue;
if(!mp[x*10000+y]) mp[x*10000+y]=++cnt;
if(!mp[y*10000+x]) mp[y*10000+x]=++cnt;
if(y<x) swap(x,y);
if(x<p) b[y-1]--,b[x]++;
else b[x+1]--,b[y]++;
}
b[p]=h;
for(int i=p+1;i<=n;++i) b[i]+=b[i-1];
for(int i=p-1;i>=1;--i) b[i]+=b[i+1];
for(int i=1;i<=n;++i) printf("%d\n",b[i]);
return 0;
}