RMQ問題的4解決方案

2021-07-10 02:10:04 字數 1580 閱讀 1023

問題描述:

rmq(range minimum/maximum query),顧名思義就是區間最大最小值查詢:給定乙個數列,求給定區間[a,b]上的最大值或最小值

解決方案:

1、列舉,遍歷數列[a,b]找出最大最小值即可。單次查詢時間複雜度o(n)

2、線段樹,分治思想,單次查詢時間複雜度o(logn)

const int inf = 0x7fffffff;

struct node

;class rmq

/*插入資料*/

void insertv(int pos, int v)

/*查詢區間最值*/

int querymax(int l, int r)

int querymin(int l, int r)

private:

/*建樹*/

void buildtree(node *root,int l, int r)

void insertnode(node *root, int pos, int v)

int querymaxv(node *root, int l, int r)

int mid = (root->l + root->r) >> 1;

int max1, max2;

if(r <= mid)

return querymaxv(root->lchild, l, r);

else if(l >= mid + 1)

return querymaxv(root->rchild, l, r);

else

}int queryminv(node *root, int l, int r)

int mid = (root->l + root->r) >> 1;

int max1, max2;

if(r <= mid)

return querymaxv(root->lchild, l, r);

else if(l >= mid + 1)

return querymaxv(root->rchild, l, r);

else

}};

3 st(sparse table)稀疏**,倍增思想,單次查詢時間複雜度o(1)

dp[i,j]表示數列[i,i + 2^j - 1]之間的最大值或最小值,預處理出dp即可

[a,b]的最大值即:max(dp[a][k],dp[b-(k<<1)+1][k]) 其中k=log2(b-a+1)

dp可通過動態規劃求得

dp[i][j] = max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);

const int inf = 0x7fffffff;

class rmq

for(int j = 1; (1<= minv[i + (1<<(j-1))][j - 1])

else}}

}int querymaxv(int l, int r)

{int k = log2(r - l + 1);

return max(maxv[l][k],maxv[r - (1

4 示例解決方案

示例解決方案包括乙個universal windows platform應用程式,用於顯示和編輯乙個圖書列表。在第37章中,這款應用將擴充套件到iphone和android xamarin.forms 上。為此,解決方案使用如下專案 bookslib 乙個.net標準庫2.0,提供模型 檢視模型和服...

越權問題的解決方案

一 橫向越權和縱向越權 越權定義 乙個正常的使用者a通常只能夠對自己的一些資訊進行增刪改查,但是由於程式設計師的一時疏忽未對資訊進行增刪改查的時候沒有進行乙個判斷,判斷所需要操作的資訊是否屬於對應的使用者,可以導致使用者a可以操作其他人的資訊。橫向越權定義 攻擊者嘗試訪問與他擁有相同許可權的使用者的...

mysql 解決方案 Mysql解決方案

mysql解決方案 一 centos7安裝mysql5.7 wget rpm uvh mysql80 community release el7 3.noarch.rpm yum repolist all grep mysql 發現預設mysql8.0是預設安裝的,然而我們要安裝的是mysql5.7...