题解 | #Tallest Cow#

Tallest Cow

https://ac.nowcoder.com/acm/contest/999/C

最高的牛

有 N 头牛站成一行,被编队为 1、2、3…N,每头牛的身高都为整数。

当且仅当两头牛中间的牛身高都比它们矮时,两头牛方可看到对方。

现在,我们只知道其中最高的牛是第 P 头,它的身高是 H ,剩余牛的身高未知。

但是,我们还知道这群牛之中存在着 M 对关系,每对关系都指明了某两头牛 A 和 B 可以相互看见。

求每头牛的身高的最大可能值是多少。

注意

  • 此题中给出的关系对可能存在重复

思路

题目要保证每头牛尽可能的高,同时又要满足题目给的m对关系,让他们相互之间能够看得见,两头牛要相互看得见,那么两头牛之间的其他牛的高度就必须小于两头牛,不能相等。既要尽可能的高,又要小于,那么就是比两个牛小1就可以。那么我们该如何处理每一对给出的关系,自己手动手动模拟模拟样例就可以发现,每当给出一组​​这个区间的数必须全部减1,才能满足,不改变前面已经给出的关系​。把一个区间内的数减1,可以用到差分来做,最后的答案,就是求一个前缀和就是原数组。

题目给的数据可能会重复,所以我们可以用一个哈希表来判断是否出现过。

code:

#include<bits/stdc++.h>
using namespace std;

const int N = 100010;
int n,a[N],p,h,m;
int d[N];//差分数组

int main(){
    scanf("%d%d%d%d",&n,&p,&h,&m);
    set<pair<int,int>> ex;
    d[1]=h;
    while (m -- ){
        int l,r;
        scanf("%d%d",&l,&r);
        if(l>r) swap(l,r);
        if(!ex.count({l,r})){
            ex.insert({l,r});
            d[l+1]--;
            d[r]++;
        }
    }
    for(int i=1;i<=n;i++){
        d[i]+=d[i-1];
        cout<<d[i]<<endl;
    }
    return 0;
}
杂题题解 文章被收录于专栏

看菜鸡做的水题

全部评论

相关推荐

喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务