zoukankan      html  css  js  c++  java
  • 51nod1174【基于线段树的RMQ】

    很基础啊~

    #include <bits/stdc++.h>
    using namespace std;
    
    typedef long long LL;
    
    const int INF=-0x3f3f3f3f;
    const int N=1e4+10;
    
    struct asd{
        int left;
        int right;
        int w;
    };
    asd q[N*4];
    
    void Build(int num,int L,int R)
    {
        q[num].left=L;
        q[num].right=R;
        if(L==R)
        {
            scanf("%d",&q[num].w);
            return;
        }
        Build(2*num,L,(L+R)/2);
        Build(2*num+1,(L+R)/2+1,R);
        q[num].w=max(q[2*num].w,q[2*num+1].w);
    }
    
    int query(int num,int s,int t)
    {
        if(s<=q[num].left&&t>=q[num].right)
            return q[num].w;
        if(q[num].right==q[num].left)
            return q[num].w;
    
        int mid=(s+t)/2;
        if(mid>=t)
            return query(2*num,s,t);
        else if(mid<s)
            return query(2*num+1,s,t);
        else
            return max(query(2*num,s,mid),query(2*num+1,mid+1,t));
    }
    
    int get_maxa(int num,int s,int t)
    {
        if(s<=q[num].left&&t>=q[num].right)
            return q[num].w;
    
        int mid=(q[num].left+q[num].right)/2;
        if(mid>=t)
            return get_maxa(2*num,s,t);
        else if(mid<s)
            return get_maxa(2*num+1,s,t);
        else
            return max(get_maxa(2*num,s,mid),get_maxa(2*num+1,mid+1,t));
    }
    
    int main()
    {
        int x,y,n,q;
        scanf("%d",&n);
        Build(1,1,n);
        scanf("%d",&q);
        while(q--)
        {
            scanf("%d%d",&x,&y);
            printf("%d
    ",get_maxa(1,x+1,y+1));
        }
        return 0;
    }
  • 相关阅读:
    Thread.join()的使用
    Java 编程思想
    LoadRunner 常见错误
    Selenium+IDEA+Maven+TestNG环境搭建
    计算机基本知识了解(二)
    Java中int和Integer的区别
    计算机基本知识了解(一)
    Jmeter安装及环境配置
    app稳定性测试-monkey测试
    .net framework
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934808.html
Copyright © 2011-2022 走看看