hihocoder 1077线段树

本文介绍了一种线段树的数据结构实现,并演示了其在区间查询与修改操作中的应用。通过具体代码示例,展示了如何构建线段树、进行区间最小值查询及节点值更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        按自己理解写了个拙劣的线段树。

        内存居然用了47MB,不知道这样的程序最多在计算机里能占用多少内存

// hiho1077 segment tree
#include<iostream>
#include<cstdio>
#include<memory.h>
using namespace std;

struct segNode{
	int s;
	int e;
	int min;
};

segNode tree[3000100];
int data[1000100];

void build(segNode* tree, int cur, int* data, int s, int e){
	tree[cur].s = s;
	tree[cur].e = e;
	if (s == e){
		tree[cur].min = data[s];
		return;
	}
	build(tree, cur * 2 + 1, data, s, (e - s + 1) / 2 + s - 1);
	build(tree, cur * 2 + 2, data, (e - s + 1) / 2 + s, e);
	tree[cur].min = (tree[cur * 2 + 1].min < tree[cur * 2 + 2].min) ? \
		tree[cur * 2 + 1].min: tree[cur * 2 + 2].min;
}

int find(segNode* tree, int cur, int s, int e){
	if (tree[cur].s == s && tree[cur].e == e) return tree[cur].min;

	if (tree[cur * 2 + 1].e >= e) return find(tree, cur * 2 + 1, s, e);
	if (tree[cur * 2 + 2].s <= s) return find(tree, cur * 2 + 2, s, e);
	int min1 = find(tree, cur * 2 + 1, s, tree[cur * 2 + 1].e);
	int min2 = find(tree, cur * 2 + 2, tree[cur * 2 + 2].s, e);
	return (min1 < min2) ? min1 : min2;
}

void modify(segNode* tree, int cur, int pos, int val){
	if (tree[cur].s == tree[cur].e) {
		tree[cur].min = val;
		return;
	}
	if (pos <= tree[cur * 2 + 1].e) modify(tree, cur * 2 + 1, pos, val);
	else modify(tree, cur * 2 + 2, pos, val);
	tree[cur].min = (tree[cur * 2 + 1].min < tree[cur * 2 + 2].min) ? \
		tree[cur * 2 + 1].min: tree[cur * 2 + 2].min;
}

int main(){
	enum Op{ inq = 0, mod } op;
	int N, Q, i, optype, l, r, res;
	scanf("%d", &N);
	for (i = 0; i <= N - 1; i++) scanf("%d", &data[i]);
	build(tree, 0, data, 0, N - 1);

	scanf("%d", &Q);
	while (Q--){
		scanf("%d%d%d", &optype, &l, &r);
		op = static_cast<Op>(optype);
		switch (op){
		case inq:
			res = find(tree, 0, l - 1, r - 1);
			printf("%d\n", res);
			break;
		case mod:
			modify(tree, 0, l - 1, r);
			break;
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值