【前缀和】洛谷P2879 Tallest Cow

链接

https://www.luogu.org/problemnew/show/P2879

大意

给定一条线段,给定一些小线段,这些小线段的左右端点高度相等,中间的点都比它们矮,给定其中一个点的高度,求所有的点的最小的高度

思路

因为小线段中的点一定小于左右端点,那么我们贪心的去想,每个点都比左右端点矮1,用 s 来记录这个点之前有几个比它高,那么每个点的最小高度就是 s i +

那么如何标记谁比它高呢?用到了前缀和的思想,在所有左端点的右边标记-1,但是这样的话就会表示成右边的点都要比它矮了,所有还要在右端点处标记+1,这样才可以保证答案的准确性

代码

#include<cstdio>
#include<map>
using namespace std;
int s[10001],a[10001],n,p,h,m,l,r;
map<pair<int,int>,bool>ma;
signed main()
{
    scanf("%d%d%d%d",&n,&p,&h,&m);
    for(register int i=1;i<=m;i++)
    {
        scanf("%d%d",&l,&r);
        if(l>r) {l^=r;r=l^r;l^=r;}
        if(ma[make_pair(l,r)]) continue;
        a[l+1]--;a[r]++;
        ma[make_pair(l,r)]=true;
    }
    for(register int i=1;i<=n;i++)
    {
        s[i]=s[~-i]+a[i];
        printf("%d\n",s[i]+h);
    }
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81625905
今日推荐