ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

线段树算法一些题

2021-04-17 10:02:05  阅读:183  来源: 互联网

标签:maxx int 线段 tree mid minx 算法 一些 root


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;
}

标签:maxx,int,线段,tree,mid,minx,算法,一些,root
来源: https://www.cnblogs.com/lightac/p/14669581.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有