题意
有n头牛,最高的牛是第i头并且它的高度为h,下面有r对牛(a,b),他们能够两两看见,能两两看见的前提是他们之间的牛都比它俩矮。求每头牛最高可能是多少?
题解
差分,先初始化数组ans为0,区间左右做标记,ans[a+1]--,ans[b]++,最后前缀和+h。(注意查重,a和b可能出现多次,但是只需要一次处理
#include <cstdio>
#include <map>
using std::map;
map<int,int>mp[10010];
int ans[10010];
int main() {
int n, i, h, t, a, b;
scanf("%d %d %d %d", &n, &i, &h, &t);
while(t--) {
scanf("%d %d", &a, &b);
if(a > b) {
int tmp = a;
a = b;
b = tmp;
}
if(mp[a][b] == 0) {
mp[a][b] = 1;
ans[a+1]--;
ans[b]++;
}
}
for(int i = 1; i <= n; i++) {
ans[i] += ans[i-1];
printf("%d\n", ans[i] + h);
}
return 0;
}