E. XKC’s basketball team(The Preliminary Contest for ICPC Asia Xuzhou 2019)
写在前面
线段树解题
样例输入
6 1
3 4 5 6 2 10
样例输出
4 3 2 1 0 -1
AC代码
#include <iostream>
#include <cstdio>
using namespace std;
int tree[3000010];
int main(){
int n, m, j, k = 1;
scanf("%d%d", &n, &m);
while (k < n + 2) k <<= 1;
for (int i = 1; i <= n; i++) scanf("%d", &tree[i + k]);
for (int i = k - 1; i > 0; i--) tree[i] = max(tree[i<<1], tree[i<<1|1]);
for (int i = k + 1; i <= k + n; i++){
j = 1;
if (tree[j] < tree[i] + m){
printf("-1");
if (i != k + n) printf(" ");
continue;
}
while (j <= k){
if (tree[j<<1|1] >= tree[i] + m) j = j << 1 | 1;
else j <<= 1;
}
if (j <= i) printf("-1");
else printf("%d", j - i - 1);
if (i != k + n) printf(" ");
}
return 0;
}