BZOJ 1635: [Usaco2007 Jan]Tallest Cow 最高的牛

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1635

解:其实它每给出一组关系x~y,都代表着x~y间的牛的最理想身高减小了1,所以我们只需用差分来维护相邻牛的关系就行,比如,f[x+1]--,f[y]++;

这里还有一个条件,就是h[y]>=h[x]但是你会发现着个条件一定是满足的,因为如果我们已经提出了x~y,就不可能有一组x1~y1,x<=x1<=y,因为x~y之间没有比它们高的牛,这也代表着,y不会再被包括在一组关系里,不会被减小。

程序:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
using namespace std;
struct ding{
  int a,b;
}p[20000];
int ans[20000],f[20000],n,x,h,m;
bool cmp(const ding&c,const ding&d) {return (c.a==d.a?c.b<d.b:c.a<d.a);}
int main()
{
  scanf("%d%d%d%d",&n,&x,&h,&m);
  for (int i=1;i<=m;i++) scanf("%d%d",&p[i].a,&p[i].b);
  sort(p+1,p+1+m,cmp);
  for (int i=1;i<=m;i++)
  if (!((p[i].a==p[i-1].a)&&(p[i].b==p[i-1].b))) 
  {
    f[min(p[i].a,p[i].b)+1]--; f[max(p[i].b,p[i].a)]++;     
  } 
  ans[x]=h;
  for (int i=x+1;i<=n;i++) ans[i]=ans[i-1]+f[i];
  for (int i=x-1;i>=1;i--) ans[i]=ans[i+1]-f[i+1];
  for (int i=1;i<=n;i++) printf("%d
",ans[i]);
  return 0;
}
原文地址:https://www.cnblogs.com/2014nhc/p/6660410.html