#0x03 最高的牛 (差分)

题解:

  • 想象一下,假如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;
}

posted @ 2020-02-02 22:55  A_sc  阅读(117)  评论(0)    收藏  举报