• 【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;
    }
  • 相关阅读:
    NC20565 生日礼物(双指针)
    NC20566 游戏(二分图)
    NC19833 地斗主(dp+矩阵快速幂)
    CF505C Mr. Kitayuta, the Treasure Hunter(dp)
    HDU5493 Queue(线段树)
    HDU5489 Removed Interval (LIS+分治)
    CF1158C Permutation recovery(线段树优化建图)
    NC20811 蓝魔法师(树形dp)
    NC20857 Xor Path(dfs)
    chrony同步时间
  • 原文地址:https://www.cnblogs.com/c-come/p/10354036.html
Copyright © 2020-2023  润新知