zoukankan      html  css  js  c++  java
  • 线段数例题2

    区间极大值1.0

    有一个长度为n的非负整数数列a.
    现在有m个询问,每个询问的格式为两个整数x和y表示询问a中,第x个数到第y个数间,最大的一个数是多少。(1<=n,m<=100000)

    输入格式:

    第一行,两个整数n和m
    第二行,n个空格间隔的整数,表示数列a
    接下来m行,每行两个整数x和y,表示一个询问

    输出格式:

    m行,每行对应一个询问的结果

    样例输入:
    7 3
    1 6 5 3 4 9 7
    2 6
    1 4
    3 5
    样例输出:
    9
    6
    5

    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
    #include <cstring>
    #include <string>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    
    struct node
    {
        int a,b,l,r,Max;
    };
    node tree[200001];
    int m,n;
    int a[100010],tot=0;
    void build(int x,int y)
    {
        int now=++tot;
        tree[now].a=x;
        tree[now].b=y;
        tree[now].Max=0;
        if(x<y)
        {
            tree[now].l=tot+1;
            build(x,(x+y)/2);
            tree[now].r=tot+1;
            build((x+y)/2+1,y);
            tree[now].Max=max(tree[tree[now].l].Max,tree[tree[now].r].Max);
        }
        else tree[now].Max=a[x];
    }
    int getmax(int p,int x,int y)
    {
        if(x<=tree[p].a&&tree[p].b<=y) return tree[p].Max;
        int lmax=0,rmax=0,mid=(tree[p].a+tree[p].b)/2;
        if(x<=mid) lmax=getmax(tree[p].l,x,y);
        if(y>mid) rmax=getmax(tree[p].r,x,y);
        return max(lmax,rmax);
    }
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++) cin>>a[i];
        build(1,n);
        for(int i=1;i<=m;i++)
        {
            int q,w;
            cin>>q>>w;
            cout<<getmax(1,q,w)<<endl;
        }
        return 0;
    }
  • 相关阅读:
    进程与线程
    the art of seo(chapter seven)
    the art of seo(chapter six)
    the art of seo(chapter five)
    the art of seo(chapter four)
    the art of seo(chapter three)
    the art of seo(chapter two)
    the art of seo(chapter one)
    Sentinel Cluster流程分析
    Sentinel Core流程分析
  • 原文地址:https://www.cnblogs.com/wanghaixv/p/8497090.html
Copyright © 2011-2022 走看看