# 資培講義6:進階資料結構 ###### tags: `建中資培講義` > [name=peienwu] ## 主題與重點摘要 ## 演算法及程式碼 ## 相關例題 - [ ] 題目名稱 ### 題目1 [題目連結]() [Submission]() > 題目敘述 > 區間RMQ 用Sparse Table 做做看, ```cpp= #include <bits/stdc++.h> #define ll long long #define ld long double #define N 500005 #define MAX_LOG 20 #define Orz ios::sync_with_stdio(0),cin.tie(0) #define INF 2e18 #define rep(i,l,r) for(int i=l;i<=r;i++) #define all(x) x.begin(),x.end() #define pii pair<int,int> #define x first #define y second using namespace std; int n,arr[N],D[N][MAX_LOG]; int LOG[N]; void init(){ LOG[1] = 0; for(int i=2;i<=n;i++){ LOG[i] = LOG[i/2]+1; } } void build_sparse(){ for(int i=0;i<n;i++)D[i][0] = arr[i]; //建立邊界 for(int j=1;(1<<j)<=n;j++){ //logN次 for(int i=0;i+(1<<j)<=n;i++){ D[i][j] = max(D[i][j-1],D[i+(1<<(j-1))][j-1]); } } } int RMQ(int l, int r){ int p = LOG[r-l+1]; return max(D[l][p],D[r-(1<<p)+1][p]); } signed main(){ Orz; cin>>n; rep(i,0,n-1)cin>>arr[i]; init(); build_sparse(); int m;cin>>m; while(m--){ int l,r;cin>>l>>r;l--;r--; if(l > r)swap(l,r); cout<<RMQ(l,r)<<endl; } } ``` #### 程式碼 ### 題目2 [題目連結]() [Submission]() > 題目敘述 #### 程式碼 ## 心得