[USACO07JAN] Tallest Cow S

题目

原题地址

解说

题目挺长,说白了就是差分模板题。
因为两个奶牛互相望得见说明之间的奶牛比它们都矮,那么我们每有一个限制条件就说明之间的奶牛的最大高度\(-1\),最后每个奶牛的高度就是最大高度减去累计减少的高度。考虑时间效率我们可以用差分数组实现。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
int n,p,h,r;
const int maxn=10000+3;
int b[maxn];
map<pair<int,int>,bool> cun;//记得判断重复出现的
int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
} 
int main(){
	n=read(); p=read(); h=read(); r=read();
	for(int i=1;i<=r;i++){
		int l=read(),r=read();
		if(l>r) swap(l,r);
		if(cun[make_pair(l,r)]) continue;
		cun[make_pair(l,r)]=1;
		b[l+1]-=1; b[r]+=1;//注意“两个奶牛之间”不包括这两只奶牛
	}
	int add=0;
	for(int i=1;i<=n;i++){
		add+=b[i];
		printf("%d\n",h+add);
	}
	return 0;
}

幸甚至哉,歌以咏志。

posted @ 2020-05-16 10:48  DarthVictor  阅读(213)  评论(0编辑  收藏  举报
莫挨老子!