演算法競賽高階指南 0x12 佇列 蚯蚓

2021-10-20 20:14:42 字數 948 閱讀 1540

m次操作,每次都要將乙個最大的切成兩段,然後再加上乙個偏移量,然後將兩段全部放入佇列中,但是這樣是o(mlogm),看題中資料範圍肯定會超時,那麼我就要繼續優化

我們可以發現,先將原序列從大到小排列(q1,q2,q3,q4…),第一次肯定是切割q1,假設將q1切成了q1l,q1r,那麼對於第二次切割只需要在q2,q1l,q1r中找到最大的即可,這個用三個佇列來維護是o(1)

對於每次切割後,都要將沒有切割的蚯蚓加上乙個偏移量q,那麼我們就可以將偏移量設為乙個整體,在每次操作後,偏移量+=q,但是對於新分割的是不加q的,那麼我們可以將這兩段減去乙個q,再放入佇列,那麼最後計算偏移量的時候就可以和其他一樣

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int n =

1e5+

10, m =

7e6+10;

int n, m, q, u, v, t;

int q1[n]

, q2[m]

, q3[m]

;int offset;

int hh1, hh2, hh3, tt1, tt2 =-1

, tt3 =-1

;int

get_max()

intmain()

cout << endl;

for(

int i =

1; i <= m + n; i++

) cout << endl;

return0;

}

演算法競賽高階指南 0x12 最大子序和

這其實是一道單調佇列優化區間dp問題,對於這個序列,我們可以劃分為n個區間,每個區間代表以ai結尾,長度不超過m的子串行和,我們只需要遍歷一遍每個集合,找到每乙個集合中的最大值,那麼就可以更新出這個序列的最大值 如何找每個集合中的最大值呢,最大值就是要求出以a k 結尾,長度不超過m的子串行和最大,...

演算法競賽高階指南 0x00

快速冪模板,寫一下快速冪的原理。我們知道,乙個數 n 在二進位制 也可以是其他進製 下可以被表示為 a 1 a 2 2 1 a 3 2 2 a m 2 那麼我們可以考慮將其分拆成二進位制狀態下的每一位,然後做冪運算。這樣做的時間複雜度為 o log 2 n 實現的過程類似於倒過來的分治 當然也可以直...

《演算法競賽高階指南》0x32約數

求解 1,n 之間的最大的反素數,有性質 這個反素數是質因數個數最多的數中最小的乙個。證明 假設有乙個數質因數個數比它多,如果在他前面,不滿足反素數的定義,如果在他後面,一定可以找到第乙個質因數比它大的數,這個數作為結果更好,反證可知,這個數質因數一定是最多的 反證 假設有質因數與他的個數一樣但是比...