zoukankan      html  css  js  c++  java
  • 线段树———区间最大数(线段树入门)

    线段树初级(区间最大数)

    其实就是对树进行二分查找      (当然需要结合递归)

    思路:

    要从区间中找到最大数,当然可以暴力求解,但你不怕超时吗???

    so      让我们来学习线段树吧!!!!!!!!!!!!!!!

    在c++里下面这个代码是极快的(哇咔咔!!!)




     

    题目描述

    给出一列数共N个,将其从1到N编号,进行M次查询[X, Y](X<=Y),给出第X个数到第Y个数间最大的数。

    输入

    一组测试数据,第一行输入N,M(1<=N, M<=10^5),第二行N个数;之后M行,每行分别为X,Y。给出一列数共N个,将其从1到N编号,进行M次查询[X, Y](X<=Y),给出第X个数到第Y个数间最大的数。

    输出

    对于每个[X, Y]输出编号在X和Y之间(包括X,Y)的最大值。每行输出一个结果。

    样例输入

    5 2
    4 3 1 2 5
    1 4
    2 5

    样例输出

    4
    5

     




    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    #define maxn 100010
     
    struct N
    {
        int l, r, max;
    } tree[maxn * 4]; //注意乘三
     
    int num[maxn];
     
    void build(int node, int l, int r)
    {
        tree[node].l = l;
        tree[node].r = r;
     
        if(l == r)
        {
            scanf("%d", &tree[node].max);
            return ;
        }
     
        int mid = (l + r) / 2;
        build(node * 2, l, mid);
        build(node * 2 + 1, mid + 1, r);
        tree[node].max = max(tree[node << 1].max, tree[node << 1 | 1].max);
        return ;
    }
     
    int query(int node, int ql, int qr)
    {
        int l = tree[node].l;
        int r = tree[node].r;
     
        if(l == ql && r == qr)
            return tree[node].max;
        //if (l == r) return tree[node].max;
        int mid = (l + r) / 2;
        if(qr <= mid)
            return query(node << 1, ql, qr);
        else if(ql > mid)
            return query(node << 1 | 1, ql, qr);
        else
            return max(query(node << 1, ql, mid), query(node << 1 | 1, mid + 1, qr));
    }
     
    int main()
    {
        int n, m;
        int ql, qr;
        scanf("%d %d", &n, &m);
        build(1, 1, n);
        for(int i = 0; i < m; i++)
        {
            scanf("%d %d", &ql, &qr);
            printf("%d ", query(1, ql, qr));
        }
    }

    用2*n和2*n+1不会出现遗漏和重复的树编号,这样就可以完美的递归啦!!!!!!!!!!!!!1

  • 相关阅读:
    SCILAB简介[z]
    UG OPEN API编程基础 2约定及编程初步
    Office 2003与Office 2010不能共存的解决方案
    UG OPEN API 编程基础 3用户界面接口
    NewtonRaphson method
    UG OPEN API编程基础 13MenuScript应用
    UG OPEN API编程基础 14API、UIStyler及MenuScript联合开发
    UG OPEN API编程基础 4部件文件的相关操作
    UG OPEN API编程基础 1概述
    16 UG Open的MFC应用
  • 原文地址:https://www.cnblogs.com/SSYYGAM/p/4354419.html
Copyright © 2011-2022 走看看