日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hihoCoder #1068 : RMQ-ST算法(模板)

發布時間:2025/4/16 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hihoCoder #1068 : RMQ-ST算法(模板) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ACG++826ms146MB

?

?

?

?

思路:

  時間復雜度O(nlogn)。

1 //#include <bits/stdc++.h> 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 #include <set> 7 #include <deque> 8 #include <map> 9 #include <algorithm> 10 #include <vector> 11 #include <iostream> 12 #define max(X,Y) ((X) > (Y) ? (X) : (Y)) 13 #define min(X,Y) ((X) < (Y) ? (X) : (Y)) 14 #define pii pair<int,int> 15 #define back que[rear-1] 16 #define INF 0x3f3f3f3f 17 #define LL long long 18 #define ULL unsigned long long 19 using namespace std; 20 const double PI = acos(-1.0); 21 const int N=1e6+20; 22 int a[N]; 23 struct ST 24 { 25 int st[N][32]; 26 void init(int a[],int n) //注意a的下標 27 { 28 for(int i=1; i<=n; i++) st[i][0]=a[i]; 29 for(int q=1; (1<<q)<=n; q++) //以(1<<i)為距離 30 for(int j=1; j+(1<<q)-1<=n; j++) //枚舉起點 31 st[j][q]=min(st[j][q-1], st[j+(1<<q-1)][q-1]); 32 } 33 int query(int L,int R) 34 { 35 int len=R-L+1; 36 for(int i=30; i>=0; i--)//這里可以預處理 37 { 38 if( (len>>i)&1 ) 39 { 40 return min(st[L][i], st[R-(1<<i)+1][i]); 41 } 42 } 43 44 } 45 }st; 46 47 int main() 48 { 49 //freopen("input.txt", "r", stdin); 50 int n, m, L, R;scanf("%d",&n); 51 for(int i=1; i<=n; i++) scanf("%d",&a[i]); 52 st.init(a,n); 53 54 scanf("%d",&m); 55 while(m--) 56 { 57 scanf("%d%d",&L,&R); 58 printf("%d\n", st.query(L,R)); 59 } 60 return 0; 61 } AC代碼

?

?

?

?

?  用模板重打了一次。

1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=1000100; 4 int w[N], pre[N][32], n, q; 5 void pre_cal() 6 { 7 for(int i=0; i<n; i++) pre[i][0]=w[i]; 8 for(int i=2,q=1; i<=n; i*=2,q++) 9 for(int j=0; j<n; j++) 10 if(j+i-1<n) pre[j][q]=min(pre[j][q-1],pre[j+i/2][q-1]); 11 else break; 12 } 13 int main() 14 { 15 //freopen("input.txt", "r", stdin); 16 cin>>n; 17 for(int i=0; i<n; i++) scanf("%d",&w[i]); //輸入重量 18 pre_cal(); //預處理 19 20 cin>>q; 21 int L, R; 22 for(int i=0; i<q; i++) //輸入查詢,并直接處理輸出 23 { 24 scanf("%d%d", &L, &R); 25 int len=R-L+1, tmp=0, cnt=0; 26 27 for(int i=0; i<30; i++)//找出二進制最高位的1 28 { 29 if(!(len>>i)) 30 { 31 tmp=((len>>(i-1))<<(i-1)); 32 break; 33 } 34 cnt++; 35 } 36 if(R==L) printf("%d\n",w[L-1]); 37 else if(tmp==len) printf("%d\n",pre[L-1][cnt-1]);//這步其實可省。 38 else printf("%d\n",min(pre[L-1][cnt-1], pre[R-tmp][cnt-1])); 39 } 40 return 0; 41 } AC代碼

?

轉載于:https://www.cnblogs.com/xcw0754/p/4506423.html

總結

以上是生活随笔為你收集整理的hihoCoder #1068 : RMQ-ST算法(模板)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。