Tallest Cow

 制胜法宝   
                                 ------前缀和

233

当两头牛能够互相看见时,他们之间的牛的身高都要比他们低,且题目要求牛身高最大。即:

int c[10005],a,b;//设牛的身高用c数组表示,两头牛分别为a,b;(a<b)
for(int i=a+1;i<=b-1;i++)
{
   c[i]--;
}

依次处理每一组数据,则第n头牛的身高为:(最高的牛的身高+c[n]);

时间爆炸!(O(n*m))

额外建立d数组,对于每组能够互相看见的牛(a,b),令d[a+1]--,d[b]++;

最后c[n]=c[n-1]+d[n];(c->d的前缀和)

牛i高=(最高的牛的身高+c[i])

这样就避免了对牛a与牛b之间牛的处理。

(提示:
1.a必须小于b,
2.牛的关系可能会输入多次。

代码:

#include<bits/stdc++.h>
using namespace std;
int fz[10005],n,i,h,r,ans[10005];
struct re
{
    int x,y;
}rep[20005];
int main()
{
    memset(rep,0,sizeof(rep));
    scanf("%d%d%d%d",&n,&i,&h,&r);
    for(int i=1;i<=r;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        if(a>b)
        swap(a,b);
        if(rep[a+b].x==a&&rep[a+b].y==b)
        {
            continue;
        }
        fz[a+1]--;
        fz[b]++;
        rep[a+b].x=a;
        rep[a+b].y=b;
    }
    for(int i=1;i<=n;i++)
    {
        ans[i]=ans[i-1]+fz[i];
        cout<<h+ans[i]<<endl;
    } 
    return 0;
 }

结束。

善用前缀和!

原文地址:https://www.cnblogs.com/HHHG/p/11101071.html