标签:前缀和 思维 区间 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