线段树之区间最大数(线段树入门)

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

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

思路:

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

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

#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\n", query(1, ql, qr));

    }

}

题目描述

给出一列数共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
时间: 2024-08-05 07:05:45

线段树之区间最大数(线段树入门)的相关文章

hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)

#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了小Ho: 假设货架上从左到右摆放了N种商品,并且依次标号为1到N,其中标号为i的商品的价格为Pi.小Hi的每次操作分为两种可能,第一种是修改价格——小Hi给出一段区间[L, R]和一个新的价格NewP,所有标号在这段区间中的商品的价格都变成NewP.第二种操作是询问——小Hi给出一段

线段树———区间最大数(线段树入门)

线段树初级(区间最大数) 其实就是对树进行二分查找      (当然需要结合递归) 思路: 要从区间中找到最大数,当然可以暴力求解,但你不怕超时吗??? so      让我们来学习线段树吧!!!!!!!!!!!!!!! 在c++里下面这个代码是极快的(哇咔咔!!!) 题目描述 给出一列数共N个,将其从1到N编号,进行M次查询[X, Y](X<=Y),给出第X个数到第Y个数间最大的数. 输入 一组测试数据,第一行输入N,M(1<=N, M<=10^5),第二行N个数:之后M行,每行分别为

HDU 1556 Color the ball(线段树:区间更新)

http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和线段树都可以,拿这道题来入门一下线段树的区间更新. 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 const int maxn = 1000

线段树——快速区间查找

线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点.    使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN).而未优化的空间复杂度为2N,因此有时需要离散化让空间压缩. #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #

hihoCode 1078 : 线段树的区间修改

#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了小Ho: 假设货架上从左到右摆放了N种商品,并且依次标号为1到N,其中标号为i的商品的价格为Pi.小Hi的每次操作分为两种可能,第一种是修改价格——小Hi给出一段区间[L, R]和一个新的价格NewP,所有标号在这段区间中的商品的价格都变成NewP.第二种操作是询问——小Hi给出一段

hdu 5412 CRB and Queries(线段树套笛卡尔树 - 动态区间第k大)

题目链接:hdu 5412 CRB and Queries 首先对所有出现过的值排序,建立线段树,每个线段树的节点是一棵笛卡尔树,笛卡尔树记录区间下标值. #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; #define lson(x) (x<<1) #define rson(x) ((x<<

Balanced Lineup(线段树之区间查找最大最小值)

传送门 线段树的区间查找最大最小值模板. 裸的线段树 #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <set> #include <queue> #include <vector> #include <cstdlib> #include <algorithm> #define ls

HDU 1540 &amp;&amp; POJ 2892 Tunnel Warfare (线段树,区间合并).

~~~~ 第一次遇到线段树合并的题,又被律爷教做人.TAT. ~~~~ 线段树的题意都很好理解吧.. 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1540 http://poj.org/problem?id=2892 ~~~~ 我的代码:200ms #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #defin

HDU 4902 线段树(区间更新)

Nice boat Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 353    Accepted Submission(s): 169 Problem Description There is an old country and the king fell in love with a devil. The devil alw