社区讨论

线段树做法求调

P1886【模板】单调队列 / 滑动窗口参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mhz4ccct
此快照首次捕获于
2025/11/15 01:15
3 个月前
此快照最后确认于
2025/11/16 13:51
3 个月前
查看原帖
CPP
#include<iostream>
#define M 1000009
#define int long long
using namespace std;
struct AC {
	int l;
	int r;
	int zxz;
	int zdz;
};
AC tree[M * 4];
int ji[M];
int a, b;
int c = 0;
inline int small(int qq, int ww) {
	if (qq < ww) {
		return qq;
	}
	return ww;
}
inline void pushup_max(int u) {
	tree[u].zdz = max(tree[u << 1].zdz, tree[u << 1 | 1].zdz);
}
inline void pushup_small(int u) {
	tree[u].zxz = small(tree[u << 1].zxz, tree[u << 1 | 1].zxz);
}
void build(int u, int l, int r) {
	tree[u].l = l;
	tree[u].r = r;
	if (l == r) {
		tree[u].zdz = ji[l];
		tree[u].zxz = ji[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(u << 1, l, mid);
	build(u << 1 | 1, mid + 1, r);
	pushup_max(u);
	pushup_small(u);
}
int qjzdz(int u, int l, int r) {
	if (tree[u].l >= l && tree[u].r <= r) {
		return tree[u].zdz;
	}
	int mid = (tree[u].l + tree[u].r) >> 1;
	int v = 0;
	if (l <= mid) {
		v = max(v, qjzdz(u << 1, l, r));
	}
	if (r > mid) {
		v = max(v, qjzdz(u << 1 | 1, l, r));
	}
	return v;
}
int qjzxz(int u, int l, int r) {
	if (tree[u].l >= l && tree[u].r <= r) {
		return tree[u].zxz;
	}
	int mid = (tree[u].l + tree[u].r) >> 1;
	int v = 1e17;
	if (l <= mid) {
		v = small(v, qjzxz(u << 1, l, r));
	}
	if (r > mid) {
		v = small(v, qjzxz(u << 1 | 1, l, r));
	}
	return v;
}
signed main() {
	scanf("%lld%lld", &a, &b);
	for (int i = 1; i <= a; ++i) {
		scanf("%lld", &ji[i]);
	}
	build(1, 1, a);
	c=0;
	for (int i = 1; i <= a-b+1; i++) {
        c++;
        if(c+b-1>a){
            break;
        }
		printf("%lld ", qjzxz(1, c, c + b-1));
	}
	c = 0;
	printf("\n");
	for (int i = 1; i <= a-b+1;i++) {
        c++;
         if(c+b-1>a){
            break;
        }
		printf("%d ", qjzdz(1, c, c + b-1));
	}
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...