题目大意就是有n个奶牛排成一排,他们的身高都是正整数,从1到n编号,最高的奶牛是第I个,高度为H。给出r个信息,每个信息为“a号牛能看到b号牛”,即a+1号到b-1号牛都比a号牛和b号牛低,要求求出每个奶牛可能的最高身高。
朴素的算法可以模拟每一个信息,让a+1号到b-1号牛的身高都减一,时间复杂度为O(nr),显然会TLE。
这时我们会想到用差分来把区间操作简化为单点操作。用d数组来存差分的话,每个信息的操作就变成了d[a+1]-1,
d[b]+1,而第i号牛的身高与最高身高的差距就是d数组前i位的和。
代码如下
#include<iostream> #include<cstdio> using namespace std; int d[10010]; bool f[10010][10010]; int main() { ios::sync_with_stdio(false); int n,m,h,r; cin>>n>>m>>h>>r; for(int i=0;i<r;++i) { int a,b; cin>>a>>b; if(a>b) swap(a,b); if(f[a][b]) continue; d[a+1]--; d[b]++; f[a][b]=true; } int sum=h; for(int i=1;i<=n;++i) { sum+=d[i]; cout<<sum<<endl; } return 0; }