差分——POJ - 3263

题目链接

用一个差分数组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

扫描二维码关注公众号,回复: 7042072 查看本文章

那么我们就可以用最高高度去加每颗树的差分的前缀和

这样最高的树的身高就是最高身高,其他树的身高一定小于等于他

题目代码

#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\n",sum[i]+high);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/helman/p/11366206.html