制胜法宝
------前缀和
当两头牛能够互相看见时,他们之间的牛的身高都要比他们低,且题目要求牛身高最大。即:
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; }
结束。