Try   HackMD

資培講義6:進階資料結構

tags: 建中資培講義

peienwu

主題與重點摘要

演算法及程式碼

相關例題

  • 題目名稱

題目1

題目連結
Submission

題目敘述
區間RMQ

用Sparse Table 做做看,

#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

題目敘述

程式碼

心得