P3865 【模板】ST表
P3865 【模板】ST表
https://www.luogu.org/problemnew/show/P3865
?
題目背景
這是一道ST表經典題——靜態區間最大值
請注意最大數據時限只有0.8s,數據強度不低,請務必保證你的每次查詢復雜度為?O(1)O(1)
題目描述
給定一個長度為?NN?的數列,和?MM?次詢問,求出每一次詢問的區間內數字的最大值。
輸入輸出格式
輸入格式:
?
第一行包含兩個整數?N, MN,M?,分別表示數列的長度和詢問的個數。
第二行包含?NN?個整數(記為?a_iai?),依次表示數列的第?ii?項。
接下來?MM行,每行包含兩個整數?l_i, r_ili?,ri?,表示查詢的區間為?[ l_i, r_i][li?,ri?]
?
輸出格式:
?
輸出包含?MM行,每行一個整數,依次表示每一次詢問的結果。
?
輸入輸出樣例
輸入樣例#1:?復制 8 8 9 3 1 7 5 6 0 8 1 6 1 5 2 7 2 6 1 8 4 8 3 7 1 8 輸出樣例#1:?復制 9 9 7 7 9 8 7 9說明
對于30%的數據,滿足:?1 \leq N, M \leq 101≤N,M≤10
對于70%的數據,滿足:?1 \leq N, M \leq {10}^51≤N,M≤105
對于100%的數據,滿足:?1 \leq N \leq {10}^5, 1 \leq M \leq {10}^6, a_i \in [0, {10}^9], 1 \leq l_i \leq r_i \leq N1≤N≤105,1≤M≤106,ai?∈[0,109],1≤li?≤ri?≤N
?
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define maxn 100005 4 #define lson l,mid,rt<<1 5 #define rson mid+1,r,rt<<1|1 6 #define pb push_back 7 #define pii pair<int,int> 8 using namespace std; 9 10 11 int a[100005]; 12 int ans[100005][25]; 13 14 int main(){ 15 int n,m; 16 scanf("%d %d",&n,&m); 17 for(int i=1;i<=n;i++){ 18 scanf("%d",&ans[i][0]); 19 } 20 for(int i=1;i<=20;i++){ 21 for(int j=1;j+(1<<i)-1<=n;j++){ 22 ans[j][i]=max(ans[j][i-1],ans[j+(1<<(i-1))][i-1]); 23 } 24 } 25 int x,y; 26 while(m--){ 27 scanf("%d %d",&x,&y); 28 int k=log2(y-x+1); 29 printf("%d\n",max(ans[x][k],ans[y-(1<<k)+1][k])); 30 } 31 } View Code?
轉載于:https://www.cnblogs.com/Fighting-sh/p/10753270.html
總結
以上是生活随笔為你收集整理的P3865 【模板】ST表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 架构设计-业务中台的方法论
- 下一篇: 【English Email】CIP p