st表求条!!!
查看原帖
st表求条!!!
1140231
ChangeYuAN楼主2024/10/4 17:39
#include <bits/stdc++.h>
using namespace std;
const int MAXLEN = 3e5 + 5;
int n, m, a[MAXLEN], LOG2[MAXLEN];

struct num {
	int id, w;
	bool operator < (const num &rhs) const {
		return rhs.w > w;
	}
	bool operator > (const num &rhs) const {
		return rhs.w < w;
	}
} maxdp[MAXLEN][31];

void init() {
	LOG2[0] = -1;
	for (int i = 1; i <= MAXLEN; i++)
		LOG2[i] = LOG2[i >> 1] + 1;
	for (int i = 1; i <= n; i++)
		maxdp[i][0].w  = a[i], maxdp[i][0].id = i;
	int p = LOG2[n];
	for (int i = 1; i <= p; i++) {
		for (int j = 1; j + (1 << i) <= n + 1; j++) {
			maxdp[j][i] = max(maxdp[j][i - 1], maxdp[j + (1 << (i - 1))][i - 1]);

		}
	}
	return;
}

num query(int l, int r) {
	int len = r - l + 1;
	int k = LOG2[len];
	return max(maxdp[l][k], maxdp[r - (1 << k) + 1][k]);
}

signed main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	init();
	for (int i = 1; i <= n; i++) {
		if (a[i] > n - i) {
			puts("0");
			continue;
		}
		num cur = query(max(a[i] + i, 1), n);
		int ai = a[cur.id], ans = cur.id - i;
		if (ai < ans) {
			puts("0");
			continue;
		}
		printf("1 %d\n", ans);
	}
	return 0;
}
2024/10/4 17:39
加载中...