洛谷 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 only the height H (1 ≤ H ≤ 1,000,000) of the tallest cow along with the index I of that cow.

FJ has made a list of R (0 ≤ R ≤ 10,000) lines of the form "cow 17 sees cow 34". This means that cow 34 is at least as tall as cow 17, and that every cow between 17 and 34 has a height that is strictly smaller than that of cow 17.

For each cow from 1..N, determine its maximum possible height, such that all of the information given is still correct. It is guaranteed that it is possible to satisfy all the constraints.

给出牛的可能最高身高,然后输入m组数据 a b,代表a,b可以相望,最后求所有牛的可能最高身高输出

输入输出格式

输入格式:

Line 1: Four space-separated integers: N, I, H and R

Lines 2..R+1: Two distinct space-separated integers A and B (1 ≤ A, B ≤ N), indicating that cow A can see cow B.

输出格式:

Lines 1..N: Line i contains the maximum possible height of cow i.

输入输出样例

输入样例#1:

9 3 5 5
1 3
5 3
4 3
3 7
9 8

输出样例#1:

5
4
5
3
4
4
5
5
5

分析:一个差分题。每当有奶牛能互相看到,就从靠前的奶牛做下标记,靠后的奶牛解除标记。注意要去重。统计答案时再按照标记计算身高。

AC代码:
 1 //FJ Tallest Cow
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<cmath>
 6
 7 using namespace std;
 8 int cow[10005];
 9
10 struct c
11 {
12     int a,b;
13 }sign[10005];
14 struct c tmp1,tmp2;
15
16 int cmp(c tmp1,c tmp2)
17 {
18     if(tmp1.a== tmp2.a)
19     return tmp1.b < tmp2.b;
20     return tmp1.a < tmp2.a;
21 }
22
23 int main()
24 {
25     int n,h,I,r,a,b,tmp = 0;
26     scanf("%d%d%d%d",&n,&I,&h,&r);
27    //实际上I并没有什么用
28     for(int i = 1;i <= r;i ++)
29     {
30         scanf("%d%d",&sign[i].a,&sign[i].b);
31         if(sign[i].a > sign[i].b)    swap(sign[i].a,sign[i].b);
32      //交换位置,保证a<b
33     }
34     sort(sign + 1,sign + r +1,cmp);
35     for(int i = 1;i <= r;i ++)
36     {
37         if(sign[i].a == sign[i+1].a && sign[i].b == sign[i+1].b)    continue;//判重
38         cow[sign[i].a + 1] ++,cow[sign[i].b] --;//标记
39     }
40     for(int i = 1;i <= n;i ++)
41     {
42         tmp += cow[i];
43         printf("%d\n",h-tmp);
44     }
45     return 0;
46 }
时间: 2024-07-30 20:30: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

传送门 题目大意: 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

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

思路: 先初始化所有牛的身高为0. 对于每一个约束条件(a,b)我们将a+1 ~ b-1的牛的身高全部减一. 朴素的减是TLE的,所以我们维护一个前缀和数组d[]来搞,对于约束条件(a,b)我们将d[a+1]--,将d[b]++. 碎碎念: 这个思路很明白,但是为什么是正确的(尤其是为什么每次减一不会产生矛盾)?我把luogu的题解浏览了一遍也没有看到证明. 所以我就自己证了一下.有两种证明方法: 一是循环不变式(算法导论上有很漂亮的例子),证起来很清晰. 二是反证法:假设有一组约束条件必须减>

[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];

洛谷—— P2880 [USACO07JAN]平衡的阵容Balanced Lineup

https://www.luogu.org/problemnew/show/P2880 题目背景 题目描述: 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛. 但是为了避免水平悬殊,牛的身高不应该相差太大. John 准备了Q (1 <= Q <= 180,000) 个可能的牛的选择和所有牛的身高 (1 <= 身高 <= 1,000,0

洛谷3258:[USACO2012 MAR]Flowerpot 花盆——题解

https://www.luogu.org/problemnew/show/P2698#sub 老板需要你帮忙浇花.给出N滴水的坐标,y表示水滴的高度,x表示它下落到x轴的位置. 每滴水以每秒1个单位长度的速度下落.你需要把花盆放在x轴上的某个位置,使得从被花盆接着的第1滴水开始,到被花盆接着的最后1滴水结束,之间的时间差至少为D. 我们认为,只要水滴落到x轴上,与花盆的边沿对齐,就认为被接住.给出N滴水的坐标和D的大小,请算出最小的花盆的宽度W. 单调队列好题,参考洛谷题解. emm……显然是

BZOJ4943 &amp; 洛谷3823 &amp; UOJ315:[NOI2017]蚯蚓排队——题解

https://www.lydsy.com/JudgeOnline/problem.php?id=4943 http://uoj.ac/problem/315 https://www.luogu.org/problemnew/show/P3823#sub 题面太长自己看吧orz. 参考:洛谷题解. 用链表暴力维护每个蚯蚓,每次合并和分离只对k*k的元素有影响,哈希一下存起来query时候比较就好了. 没了. (具体复杂度我不会证明,以及bzoj卡空间,正常的哈希表空间总觉得不能开如代码所示的这么

洛谷 P3660 [USACO17FEB]Why Did the Cow Cross the Road III G(树状数组)

题目背景 给定长度为2N的序列,1~N各处现过2次,i第一次出现位置记为ai,第二次记为bi,求满足ai<aj<bi<bj的对数 题目描述 The layout of Farmer John's farm is quite peculiar, with a large circular road running around the perimeter of the main field on which his cows graze during the day. Every morn