【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\n",h+c[i]);
    }
    return 0;
}

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

时间: 2024-11-05 06:27:33

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

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

To 洛谷.2879 区间统计 题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positive integer height (which is a bit of secret). You are told only the height H (1 ≤ H ≤ 1,000,000) of the tallest cow along with th

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

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=2879 题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positive integer height (which is a bit of secret). You are told on

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

传送门 题目大意: n头牛,其中最高身高为h,给出r对关系(x,y) 表示x能看到y,当且仅当y>=x并且x和y中间的牛都比 他们矮的时候,求每头牛的最高身高. 题解:贪心+差分 将每头牛一开始都设为最高高度. 每一对关系(x,y),我们将[x+1,y-1]这个区间的身高变为 min(x,y)-1.这样是不对了.因为要维护[x+1,y-1]这个区间里 各个元素的大小关系,所以要将[x+1,y-1]的元素身高都减1. 一开始我是用线段树做的,后来发现题解用的差分. 没有询问的区间修改,差分做就好了

[USACO07JAN]区间统计Tallest Cow

题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positive integer height (which is a bit of secret). You are told only the height H (1 ≤ H ≤ 1,000,000) of the tallest cow along with the index I of tha

[Luogu] 区间统计Tallest Cow

https://www.luogu.org/problemnew/show/P2879 差分 | 线段树 #include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int N = 1e4 + 10; #define gc getchar() struct Node {int l, r;}A[N]; int n, my, Maxh, R; int H[N];

Tallest Cow(POJ3263)

Tallest Cow(POJ3263) 给出N头牛的身高,和M对关系(ai与bi可以相互看见.即他们中间的牛都比他们矮).已知最高的牛为第P头,身高为H.求每头牛的身高最大可能是多少.( \(1 \leq N,M \leq 10^4, 1 \leq H \leq 10^6\) ) 输入样例: 9 3 5 5 1 3 5 3 4 3 3 7 9 8 输出样例: 5 4 5 3 4 4 5 5 5 分析: 朴素解法:数组C初始化0 ,ai与bi之间的数减一 最后设C[P] = 0 即Hi = H+

1635: [Usaco2007 Jan]Tallest Cow 最高的牛

1635: [Usaco2007 Jan]Tallest Cow 最高的牛 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 383  Solved: 211[Submit][Status] Description FJ's N (1 <= N <= 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positive integer height

POJ3263 Tallest Cow

Tallest Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 2368   Accepted: 1084 Description FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positive integer height (which is a bit of secret

Tallest Cow(线段树较易)

题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positive integer height (which is a bit of secret). You are told only the height H (1 ≤ H ≤ 1,000,000) of the tallest cow along with the index I of tha