POJ3263Tallest Cow
Posted nsd-email0820
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ3263Tallest 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; }
以上是关于POJ3263Tallest Cow的主要内容,如果未能解决你的问题,请参考以下文章