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

Posted c-come

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于P2879 [USACO07JAN]区间统计Tallest Cow {前缀和,思维}的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P2879 [USACO07JAN]区间统计Tallest Cow

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

[USACO07JAN]区间统计Tallest Cow

P2880 [USACO07JAN]平衡的阵容Balanced Lineup(RMQ的倍增模板)

LuoguP2876 [USACO07JAN]解决问题Problem Solving (区间DP)(未完成)

[USACO07JAN]Balanced Lineup