搭建pypi私有倉庫實現過程詳解
阿新 • • 發佈:2020-11-26
(有點慌張,因為剛學會,就寫了,可能會漏洞百出,而且學長們最近忙於比賽,可能沒時間看,之後再慢慢修改吧)
st表是解決rmq問題有力的工具
不支援線上修改,可以\(O(1)\)查詢最值,\(O(nlogn)\)預處理,只能處理靜態區間最值。
st表用了倍增,動規的思想,以最大值為例
\(st[i][j]\)表示從\(i\)起,向後\(2^j\)個數中的最大值(包括\(i\)在內),也就是陣列從下標\(i\)到下標\(i + 2^j-1\)中的最大值。
轉移的時候,將當前區間拆成兩半,分別取最值。
也就是區間\([i, i + 2^{j-1}-1]\) 和 區間\([i + 2^{j-1}, i + 2^j-1]\)
\(st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1])\)
for(int i = 1; i <= n; i++)
st[i][0] = a[i];
for(int j = 1; j <= 21; j++)
for(int i = 1; i + (1 << j) - 1 <= n; i++)
st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j -1]);
查詢的時候,初始化中每一個狀態的區間長度都是\(2^j\)
所以要引入一個定理:\(2^{log(a)} > a/2\)
因為\(log(a)\)表示小於等於a的2的最大幾次方。
比如說 \(log(4)=2, log(5)=2, log(6)=2, log(7)=2, log(8)=3, log(9)=3\)…….
那麼我們要查詢l到r的最大值。
設\(len = r - l + 1,t=log(len)\)
根據上面的定理:\(2^t > len/2\)
從位置上來說,\(l+2^t\)越過了x到y的中間!
因為位置過了一半
所以l到r的最小值可以表示為 \(min(從l往後2^t的最小值, 從r往前2^t的最小值)\)
前面的狀態表示為\(st[l][t]\)
設後面(從r往前2^t的最小值)的初始位置是k,
那麼\(k+2^t-1=r\),所以\(k=r-2^t+1\)
所以後面的狀態表示為\(st[r-2^t+1][t]\)
所以x到y的最小值表示為\(min(mn[l][t],mn[r-2^t+1][t]\)),所以查詢時間複雜度是\(O(1)\)
#include <cstdio>
#include <iostream>
#include <cmath>
#define orz cout<<"AK IOI";
using namespace std;
const int maxn = 100010;
const int maxm = 2000010;
inline int read()
{
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
return x * f;
}
int n, m;
int a[maxn], st[maxn][21];
int query(int l, int r)
{
int k = log2(r - l + 1);
return max(st[l][k], st[r - (1 << k) + 1][k]);
}
int main()
{
n = read(); m = read();
for(int i = 1; i <= n; i++)
a[i] = read();
for(int i = 1; i <= n; i++)
st[i][0] = a[i];
for(int j = 1; j <= 21; j++)
for(int i = 1; i + (1 << j) - 1 <= n; i++)
st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j -1]);
for(int i = 1; i <= m; i++)
{
int l, r;
l = read(); r = read();
printf("%d\n",query(l, r));
}
return 0;
}
感謝 https://www.cnblogs.com/qq965921539/p/9608980.html
https://www.cnblogs.com/zwfymqz/p/8581995.html
https://blog.csdn.net/Hanks_o/article/details/77547380