101. 最高的牛

这是一个比较典型使用差分技巧的题。
题目中给出了M对牛可以互相看见对关系,那么对于两个可以互相看到的牛a,b。在差分数组B中,只需要让

B[a+1] -= 1
B[b] += 1

这样做可以保证a,b之间的牛至少比a,b少一个高度,这样就能使得a,b可以互相看见
进过M次处理之后,就可以把差分数组转换成原始数组,原始数组还有加上最高位与原始数组上对应位的差值,也就是加上H-A[p]
因为此题的M对关系可能重复,这里我用的set进行去重复

#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
const int maxn = 1e6+10;
typedef pair<int,int> pii;

int N,P,H,M;
int A[maxn],B[maxn];//高度数组,差分数组
set<pii> st;
int main(){
    cin>>N>>P>>H>>M;
    int a,b;
    while(M--){
        scanf("%d%d",&a,&b);
        if(a>b) swap(a,b);
        if(a!=b) st.insert({a,b});
    }
    for(auto p:st){
        B[p.first+1]--;
        B[p.second]++;
    }
    for(int i = 1;i<=N;i++) A[i] = A[i-1]+B[i];
    for(int i = 1;i<=N;i++){
        printf("%d\n",A[i]+H-A[P]);
    }
    return 0;
}