zoukankan      html  css  js  c++  java
  • 差分——POJ

    题目链接

    用一个差分数组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;
    }
  • 相关阅读:
    localhost/127.0.0.1:8080
    android要注意的小问题
    2016年度工作计划
    2016年度计划总结
    竞品分析的思路
    《竞品调研:抄也是一门学问》学习总结
    书籍名单
    2015年度计划-总结
    以前的博客
    和老板沟通学习记录
  • 原文地址:https://www.cnblogs.com/helman/p/11366206.html
Copyright © 2011-2022 走看看