社区讨论

请求加强数据

P3865【模板】ST 表 & RMQ 问题参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lrt6gih9
此快照首次捕获于
2024/01/25 20:15
2 年前
此快照最后确认于
2024/01/25 22:15
2 年前
查看原帖
线段树艹过去了,而且打的还不卡常,只加了一个快读 (和远古魔法)
正常 ST表 都能 450ms\le450\operatorname{ms} 过,所以觉得可以缩到 0.5s0.5\operatorname{s}
测评记录 click here,没开 O2(开了更慢?!),最大点 778ms778\operatorname{ms}
CPP
#include <iostream>
using namespace std;

#define MS 100005

#define getchar getchar_unlocked

inline int read() {
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

struct SegmentTree {
	
	struct node {
		
		int l, r, v;
		
#define ls(idx) ((idx) << 1)
#define rs(idx) (ls(idx) | 1)
		
	} t[MS << 2];
	
	void build(int l, int r, int idx) {
		t[idx].l = l, t[idx].r = r;
		if (l == r) {
			t[idx].v = read();
			return;
		}
		int m = (l + r) >> 1;
		build(l, m, ls(idx));
		build(m + 1, r, rs(idx));
		t[idx].v = max(t[ls(idx)].v, t[rs(idx)].v);
	}
	
	int queryMAX(int l, int r, int idx) {
		if (r < t[idx].l || t[idx].r < l)
			return -0x3f3f3f3f;
		if (l <= t[idx].l && t[idx].r <= r)
			return t[idx].v;
		return max(queryMAX(l, r, ls(idx)), queryMAX(l, r, rs(idx)));
	}
	
} tree;

int n, q;

int main() {
	n = read(); q = read();
	tree.build(1, n, 1);
	while (q --) {
		int l, r;
		l = read(); r = read();
		printf("%d\n", tree.queryMAX(l, r, 1));
	}
	return 0;
}

回复

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

正在加载回复...