# Tallest Cows(差分)

Tallest Cows(差分)


  • n头牛,给出最高牛的位置和身高,其他牛身高未知,给出m对相对关系,表示可以相互看见当且仅当他们中间的牛都比他们矮。求每头牛身高最大值是多少。

  • 差分数组的性质:前缀和为原序列

  • 给出相对关系可以考虑使用差分,a,b可以看见,则将a,b之间的所有的牛身高c[]减1,使用差分数组d[]维护。最后差分数组的前缀和就是和最高牛的相对关系(最高牛c[]的值肯定为0,他不可能在任何可以相互看见的两头牛中间)
    AC Code:

#include <bits/stdc++.h>
using namespace std;
#define fre freopen("C:\\Users\\22765\\Desktop\\in.txt","r",stdin);
#define mem(a) memset((a),0,sizeof(a))
#define fo(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
#define rep(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)//宏定义,编译时展开,占用编译时间
#define sf(x) scanf("%d",&(x))
const int inf=(0x7f7f7f7f);
const int maxn=10005;
map<pair<int,int>,bool> mp;
int c[maxn],d[maxn];
int main(){
    int n,p,h,m;    
    scanf("%d%d%d%d",&n,&p,&h,&m);
    int a,b;
    while(m--){
        sf(a);sf(b);
        if(a>b)swap(a,b);
        
        if(mp[make_pair(a,b)])continue;
        
        mp[make_pair(a,b)]=true;
        d[a+1]--;d[b]++;
    }
    fo(i,1,n+1){
        c[i]=c[i-1]+d[i];
        cout<<c[i]+h<<endl;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/sstealer/p/11129376.html
今日推荐