【POJ3263】Tallest Cow

题面

FJ的N头奶牛按序号1..N排成一排。 每头奶牛都有正整数高度。 你只被告知最高的奶牛的高度H(1≤H≤1,000,000)以及该奶牛的位置P.

FJ已经列出了“牛17看到牛34”形式的R(0≤R≤10,000)行。 这意味着奶牛34至少与奶牛17一样高,并且17至34之间的每头奶牛的高度严格小于奶牛17的高度。

对于来自1..N的每头奶牛,确定其最大可能高度,以便给出的所有信息仍然正确。 保证可以满足所有约束条件。

分析

如果i和j可以互相看到,说明i+1~j-1的奶牛至少都比i和j矮1个单位,所以只需要区间修改i+1~j-1即可,显然差分最简便

没有比最高的奶牛还高的奶牛,所以最高的奶牛的高度一定是0,最后求前缀和查询。

写的比较好看的是判重操作,再加上makepair,很方便。

需要注意的是差分的下标,在l+1位置-1,r位置+1,才等价于修改l+1~r-1

#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
using namespace std;
int n,p,h,m;
#define N 10100
map<pair<int,int>,bool>flag;
int a[N],c[N],s[N];
int main()
{
    scanf("%d%d%d%d",&n,&p,&h,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        if(x>y)swap(x,y);
        if(flag[make_pair(x,y)])continue;
        c[x+1]--;c[y]++;
        flag[make_pair(x,y)]=1;
    }
    for(int i=1;i<=n;i++)
    {
        s[i]=s[i-1]+c[i];
        printf("%d
",s[i]+h);
    }
    return 0;
}
“Make my parents proud,and impress the girl I like.”
原文地址:https://www.cnblogs.com/NSD-email0820/p/9550592.html