码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-02-06 21:05:40      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:前缀和   思维   区间   return   continue   col   题解   include   algo   

思路:

先初始化所有牛的身高为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\n",h+c[i]);
    }
    return 0;
}

 

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

标签:前缀和   思维   区间   return   continue   col   题解   include   algo   

原文地址:https://www.cnblogs.com/c-come/p/10354036.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!