• 【P2879】 [USACO07JAN]区间统计Tallest Cow {前缀和,思维}


    思路:

    先初始化所有牛的身高为0。

    对于每一个约束条件(a,b)我们将a+1 ~ b-1的牛的身高全部减一。

    朴素的减是TLE的,所以我们维护一个前缀和数组d[]来搞,对于约束条件(a,b)我们将d[a+1]--,将d[b]++。

    碎碎念:

    这个思路很明白,但是为什么是正确的(尤其是为什么每次减一不会产生矛盾)?我把luogu的题解浏览了一遍也没有看到证明。

    所以我就自己证了一下。有两种证明方法:

    一是循环不变式(算法导论上有很漂亮的例子),证起来很清晰。

    二是反证法:假设有一组约束条件必须减>=2才能够满足,可以导出矛盾。

    这里不展开证明,经过思考应当容易写出。

    code:

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <map>
    using namespace std;
    
    map<pair<int,int>,bool> existed;
    int c[10010],d[10010];
    
    int main(){
        int n,p,h,m;
        scanf("%d%d%d%d",&n,&p,&h,&m);
        for(int i = 1;i <= m;++i){
            int a,b;
            scanf("%d%d",&a,&b);
            if(a > b)std::swap(a,b);
            if(existed[make_pair(a,b)])continue;
            d[a+1]--,d[b]++;
            existed[make_pair(a,b)] = true;
        }
        for(int i = 1;i <= n;++i){
            c[i] = c[i-1]+d[i];
            printf("%d
    ",h+c[i]);
        }
        return 0;
    }
  • 相关阅读:
    Mysql多实例配置
    Mysql多实例主从复制
    粪发涂墙-321
    粪发涂墙-123
    SpringCloud-粪发涂墙90
    线上BUG定位神器(阿尔萨斯)-Arthas2019-0801
    confluence-工具安装
    新应用启动之类冲突-2019-7-26
    新项目组之应用启动-2019-07-25
    新装虚拟机-2019-07-24日记
  • 原文地址:https://www.cnblogs.com/c-come/p/10354036.html
Copyright © 2020-2023  润新知