本文主要是介绍线段树算法一些题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
POJ3264
/*
算法过程:
1.构建线段树
2.在线段树中插入数据
3.对线段树进行更新(该题无更新操作)和查询
*/
#include <cstdio>
#include <algorithm>
using namespace std;
const int INF = 0xffffff0;
struct node{
int l; //区间左端点
int r; //区间右端点
//下面是特殊设定的数据域
int minx, maxx; //区间中最高和最矮的奶牛身高
}tree[800010];
int minx = INF;
int maxx = -INF;
// 对区间l,r建立线段树
void build_tree(int i, int l, int r) {
//节点i的数据域的初始化(即根节点)
tree[i].l = l;
tree[i].r = r;
tree[i].minx = INF;
tree[i].maxx = -INF;
if(l != r) {
int mid = (l + r) / 2;
build_tree(2 * i + 1, l, mid);
build_tree(2 * i + 2, mid + 1, r);
}
}
void Insert(int root, int i, int h) {
if(tree[root].l == tree[root].r) {
tree[root].maxx = tree[root].minx = h;
return;
}
tree[root].minx = min(tree[root].minx, h);
tree[root].maxx = max(tree[root].maxx, h);
if(i <= (tree[root].l + tree[root].r) / 2) {
Insert(2 * root + 1, i, h);
} else {
Insert(2 * root + 2, i, h);
}
}
void query(int root, int a1, int a2) {
if(tree[root].minx >= minx && tree[root].maxx <= maxx) {
return;
}
if(tree[root].l == a1 && tree[root].r == a2) {
minx = min(minx, tree[root].minx);
maxx = max(maxx, tree[root].maxx);
return;
}
int mid = (tree[root].l + tree[root].r) / 2;
if(a2 <= mid) {
query(2 * root + 1, a1, a2);
} else if(a1 > mid) {
query(2 * root + 2, a1, a2);
} else {
query(2 * root + 1, a1, mid);
query(2 * root + 2, mid + 1, a2);
}
}
int main () {
int N, Q;
scanf("%d%d", &N, &Q);
build_tree(0, 1, N);
for(int i = 1; i <= N; ++i) {
int h;
scanf("%d", &h);
Insert(0, i, h);
}
while(Q--) {
int a1, a2;
scanf("%d%d", &a1, &a2);
minx = INF;
maxx = -INF;
query(0, a1, a2);
printf("%d\n", maxx - minx);
}
return 0;
}
这篇关于线段树算法一些题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!