1174 區間中最大的數(線段樹)
阿新 • • 發佈:2019-02-01
基準時間限制: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
Output
第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)
共Q行,對應每一個查詢區間的最大值。Input示例
5 1 7 6 3 1 3 0 1 1 3 3 4Output示例
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; }