线段树求调,样例都没过
查看原帖
线段树求调,样例都没过
528430
FiraCode楼主2022/10/12 21:40

CODE:

#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
int a[N];
int n, m, c;
struct Node {
	int l, r, minn, maxn;
}tr[N * 4];
void build(int u, int l, int r) {
	tr[u].l = l;
	tr[u].r = r;
	if (l == r){
		tr[u].minn = tr[u].maxn = a[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(u << 1, l, mid);
	build(u << 1 | 1, mid + 1, r);
	tr[u].maxn = max(tr[u << 1].maxn, tr[u << 1 | 1].maxn);
	tr[u].minn = min(tr[u << 1].minn, tr[u << 1 | 1].minn);
}
int query(int u, int l, int r) {//求区间最小值
	if (tr[u].l >= l && tr[u].r <= r) {
		return tr[u].minn;
	}
	int mid = (tr[u].l + tr[u].r) >> 1;
	int res = 1 << 30;
	if (l <= mid) res = query(u << 1, l, r);
	if (r > mid) res = min(res, query(u << 1 | 1, l, r));
	return res;
}
int query1(int u, int l, int r) {//求区间最大值
	if (tr[u].l >= l && tr[u].r <= r) {
		return tr[u].maxn;
	}
	int mid = (tr[u].l + tr[u].r) >> 1;
	int res = 0;
	if (l <= mid) res = query(u << 1, l, r);
	if (r > mid) res = max(res, query(u << 1 | 1, l, r));
	return res;
}
int main() {
	scanf("%d%d%d", &n, &m, &c);
	for (int i = 1; i <= n; ++i)
		scanf("%d", &a[i]);	
	build(1, 1, n);
	bool flag = false;
	for (int i = 1; i <= n - m + 1; ++i) {
		if (query1(1, i, i + m - 1) - query(1, i, i + m - 1) <= c) {
			flag = true;
			printf("%d\n", i);
		}
	}
	if (!flag) puts("NONE");
	return 0;
}

stOrz{\LARGE \texttt{stOrz}}

2022/10/12 21:40
加载中...