rmq演算法全稱為(range minimum/maximum query)意思是給你乙個長度為n的陣列a,求出給定區間的最值的下標。當然我們可以採用列舉,但是我們也可以使用線段樹來優化,複雜度為(nlogn),但是最好的辦法是採用sparse_table演算法,簡稱st演算法。他能在進行(nlogn)的預處理後達到n(1)的效率。下面來分析下最大值和最小值,都要用到dp的思想。
最小值(mininun):我們可以用f(i,j)表示區間[i,i+2^j-1]間的最小值。我們可以開闢陣列來儲存f(i,j)的值,例如:f(2,4)就是儲存區間[2,2+2^4-1]=[2,17]的最小值。那麼f(i,0)的值是確定的,就為i這個位置所指的元素值,這時我們可以把區間[i,i+2^j-1]平均分為兩個區間,因為j>=1的時候該區間的長度始終為偶數,可以分為區間[i,i+2^(j-1)-1]和區間[i+2^(j-1)-1,i+2^j-1],即取兩個長度為2^(j-1)的塊取代和更新長度為2^j的塊,那麼最小值就是這兩個區間的最小值的最小值,動態規劃為:f[i,j]=min(f[i,j-1],f[i+2^(j-1),j-1]).同理:最大值就是f[i,j]=max(f[i,j-1],f[i+2^(j-1),j-1]).
現在求出了f[i,j]之後又是怎樣求出最大值或者最小值的,怎麼轉換為o(1)這種演算法的~這就是st演算法:
這個時候詢問時只要取k=ln(j-i+1)/ln2即可,那麼可以令a為i到2^k的塊,和b為到2^k結束的長度為2^k的塊;那麼a,b都是區間[i,j]的子區間,所以即求a區間的最小值和b區間的最小值的最小值。這個時候動態規劃為:rmq(i,j)=min(f[i,k],f[j-2^k+1,k]);
int dp[maxn][21]; // 初始化dp[i][0] = a[i];
void rmq(int n)
int get_ma(int l, int r)
void solve()
}
QT qtableview 不更新資料
用了qtableview 搭配 從qabstracttablemodel 繼承的 model,但 emit datachanged lefttop,rightbottom 後,tableview的資料 沒有更新,後來發現是多繼承了乙個qobject class model public qobjec...
很久不更新了,今天更新一下
調回到人郵社發行經營部負責市場和教材推廣,說白了就是賣書的,只是賣的書雜了,多了,什麼都賣,所以介紹大家乙個可以買到人郵社書的地方,有很多的獎品和禮物給大家。人民郵電出版社官方 開張了,位址是 我們 的開業得到了 網的大力支援。在影視書籍頻道 http www.taobao.com vertical...
Gitlab不更新Activity的解決方案
gitlab的資料目錄,預設是在 var opt gitlab下。很多時候,linux系統預設安裝的分割槽,沒有大容量用來存 因此需要遷移此目錄到其他磁碟分割槽。遷移的方案可以是建立軟連線,在 var下將opt目錄移動到 mnt sdb下,然後建立軟連線opt指向 mnt sdb opt。使用sud...