用一个差分数组d
A能看见B或者是B能看见A
(假设A<B)都说明A+1比A矮,B比B-1高,即d[a+1]--,d[b]++
但为什么不说B-1比B矮呢,这样就是d[a+1]--,d[b-1]--了
我认为啊,因为最后K的高度是要由sigma d[i] 1<=i<=K 加起来的
每次操作都是一加一减呢,能便于求高度
而且,对于最高的那颗树K,I能看见K
如果i<k,那么d[i+1]--,d[k]++,最后求K的高度时,两个相抵消
如果i>k,那么d[k+1]--,d[i]++,最后求K的高度时,d[k+1]和d[i]都不会算进去
所以sigma d[i] 1<=i<=k 一定为0
那么我们就可以用最高高度去加每颗树的差分的前缀和
这样最高的树的身高就是最高身高,其他树的身高一定小于等于他
题目代码
#include<iostream> #include<stdio.h> #include<string.h> #include<map> using namespace std; typedef long long LL; const int maxn=10007; int d[maxn],sum[maxn]; int n,m,high,index,a,b; map<pair<int,int>,bool>existed; int main(){ scanf("%d%d%d%d",&n,&index,&high,&m); for(int i=1;i<=m;i++){ scanf("%d%d",&a,&b); if(a>b)swap(a,b); if(existed[make_pair(a,b)])continue; existed[make_pair(a,b)]=true; d[a+1]--,d[b]++; } for(int i=1;i<=n;i++){ sum[i]=sum[i-1]+d[i]; printf("%d ",sum[i]+high); } return 0; }