佇列之blah集合

2022-04-07 07:37:35 字數 1332 閱讀 1112

做了乙個noi上面的問題,叫blah集合,以a為基數,則2x+1和3x+1都在集合中,且集合中全部元素都由此計算得來。a∈[1,50],問公升序排列後第n(n∈[1,1000000])個元素是多少。以輸入示例a=1,n=100,b[n]=418為例:

集合中第乙個元素(基數)為1,

1  3  4  7 10 9

2x+1: 3  7

9 15 21 19……

3x+1: 4 10

13 22 31 27……

依次計算時會發現每1個資料會變為2個,這些數又會發生交叉。題目需要得到公升序後第n個,我們如果先計算再排序一定會超時的,所以我們需要分別把2x+1和3x+1儲存起來,然後取之前儲存的較小的輸出出來,佇列很適合這項工作:

#include#include

typedef unsigned

long

long

uint64;

using

namespace

std;

uint64 blah(

intbase,int

maxid)

else

if(x2.front()else

x2.push(curval*2+1

); x3.push(curval*3+1

); curid++;

}return

curval;

}int

main()

}

不過遺憾的是,這份**超時了,雖然它在我的計算機上計算得到結果是瞬間的事情。那麼問題在哪呢?只能說可能出現在對front和pop的呼叫耗時上,當然也可能有記憶體分配方面的耗時。好吧,我們避免這些呼叫和重複的初始化——用陣列來模擬一下佇列:

#includetypedef unsigned 

long

long

uint64;

using

namespace

std;

uint64 x2[

1000000],x3[1000000

];uint64 blah(

intbase,int

maxid)

else

if(x2valelse

x2[++x2cnt]=curval*2+1

; x3[++x3cnt]=curval*3+1

; curid++;

}return

curval;

}int

main()

}

這份**就以很短的時間通過了測試。

Blah數集(雙指標單調佇列)

描述 大數學家高斯小時候偶然間發現一種有趣的自然數集合blah,對於以a為基的集合ba定義如下 1 a是集合ba的基,且a是ba的第乙個元素 2 如果x在集合ba中,則2x 1和3x 1也都在集合ba中 3 沒有其他元素在集合ba中了。現在小高斯想知道如果將集合ba中元素按照公升序排列,第n個元素會...

Java集合之佇列

jdk兩套佇列 為什麼要使用阻塞佇列?消費者和生產者不會保持相同的速度,如生產者快時候,佇列會越來越大,相比之下,阻塞佇列只允許生產者的速度在一定速度上超過消費者的速度,但不會超過很多。linkedblockingqueue 基於鍊錶的無界阻塞佇列,但也可以指定長度,不指定無界,內部維護了乙個鍊錶快...

C 基礎之 集合 佇列

佇列是其元素以先進先出 fifo 的方式來處理的集合。先放在佇列中 的元素會先讀取。佇列的例子有在機場排的隊 人力資源部中等待處理求職信的佇列 列印佇列中等待處理的列印任務 以迴圈方式等 處理的執行緒。另外,還常常 有元素根據其優先順序來處理的佇列。例如,在機場的佇列中,商務艙乘客的處理要優先於經濟...