1. 程式人生 > >1174 區間中最大的數(線段樹)

1174 區間中最大的數(線段樹)

基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題  收藏  關注 給出一個有N個數的序列,編號0 - N - 1。進行Q次查詢,查詢編號i至j的所有數中,最大的數是多少。 例如: 1 7 6 3 1。i = 1, j = 3,對應的數為7 6 3,最大的數為7。(該問題也被稱為RMQ問題) Input
第1行:1個數N,表示序列的長度。(2 <= N <= 10000)
第2 - N + 1行:每行1個數,對應序列中的元素。(0 <= S[i] <= 10^9)
第N + 2行:1個數Q,表示查詢的數量。(2 <= Q <= 10000)
第N + 3 - N + Q + 2行:每行2個數,對應查詢的起始編號i和結束編號j。(0 <= i <= j <= N - 1)
Output
共Q行,對應每一個查詢區間的最大值。
Input示例
5
1
7
6
3
1
3
0 1
1 3
3 4
Output示例
7
7

3

#include<cstdio>
#include<iostream>
using namespace std;
int n,q,a,b,mx[10002*4];
void buildtree(int l,int r,int rt)
{
    if(l==r)
    {
        cin>>mx[rt];
        return;
    }
    int mid=(l+r)/2;
    buildtree(l,mid,rt*2);
    buildtree(mid+1,r,rt*2+1);
    mx[rt]=max(mx[rt*2],mx[rt*2+1]);
}
int querymx(int l,int r,int rt,int ll,int rr)
{
    if(ll<=l&&rr>=r) return mx[rt];
    int mid=(l+r)/2,cnt=0;
    if(l<=rr&&ll<=mid) cnt=max(cnt,querymx(l,mid,rt*2,ll,rr));
    if(mid<rr&&ll<=r) cnt=max(cnt,querymx(mid+1,r,rt*2+1,ll,rr));
    return cnt;
}
int main()
{
    ios::sync_with_stdio(0);
    cin>>n;
    buildtree(1,n,1);
    cin>>q;
    while(q--)
    {
        cin>>a>>b;
        cout<<querymx(1,n,1,a+1,b+1)<<endl;
    }
    return 0;
}