区间查询,果断想到线段树,看了一下题解有很多用的st表,但感觉st表模板太难记了,线段树相对好记很多,还是线段树更香一点。

树状数组也可以求最值但得改模板。

参考代码:

#include using namespace std;

const int N = 100010;
int w[N];
int n, m;
struct node {
	int l, r;
	int minv;
}tr[N * 4];

//向上更新
void pushup(int u) {
	tr[u].minv = min(tr[u << 1].minv, tr[u << 1 | 1].minv);
}

//初始化
void bulid(int u, int l, int r) {
	if (l == r) tr[u]= { l,r,w[r] };
	else {
		tr[u] = { l,r };
		int mid = l + r >> 1;
		bulid(u << 1, l, mid);
		bulid(u << 1 | 1, mid + 1, r);
		pushup(u);
	}
}

//区间查询
int query(int u, int l, int r) {
	if (tr[u].l >= l && tr[u].r > 1;
	if (l <= mid) res = min(res, query(u << 1, l, r));
	if (r > mid)res = min(res, query(u << 1 | 1, l, r));
	return res;
}

//将x位置的数修改为v,此题没有用到单点修改,这个函数可以不写
void modify(int u, int x, int v) {
	if (tr[u].l == tr[u].r) tr[u].minv = v;
	else {
		int mid = tr[u].l + tr[u].r >> 1;
		if (x <= mid)modify(u << 1, x, v);
		else modify(u << 1 | 1, x, v);
		pushup(u);
	}
}
int main()
{
        //大输入记得开取消同步流或者用cstdio不然必超时
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> m >> n;
	for (int i = 1; i > w[i];
	bulid(1, 1, m);
	while (n--) {
		int l, r;
		cin >> l >> r;
		cout << query(1, l, r) << '\n';
	}
	return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论