洛谷P2827 蚯蚓

2022-06-13 15:54:09 字數 1269 閱讀 3333

本題中,我們將用符號 \(\lfloor c \rfloor\) 表示對 \(c\) 向下取整,例如:\(\lfloor 3.0 \rfloor = \lfloor 3.1 \rfloor = \lfloor 3.9 \rfloor = 3\)。

蛐蛐國最近蚯蚓成災了!隔壁跳蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去請神刀手來幫他們消滅蚯蚓。

蛐蛐國裡現在共有 \(n\) 只蚯蚓(\(n\) 為正整數)。每只蚯蚓擁有長度,我們設第 \(i\) 只蚯蚓的長度為 \(a_i\) (\(i=1,2,\dots,n\)),並保證所有的長度都是非負整數(即:可能存在長度為 \(0\) 的蚯蚓)。

每一秒,神刀手會在所有的蚯蚓中,準確地找到最長的那乙隻(如有多個則任選乙個)將其切成兩半。神刀手切開蚯蚓的位置由常數 \(p\)(是滿足 \(0 < p < 1\) 的有理數)決定,設這只蚯蚓長度為 \(x\),神刀手會將其切成兩隻長度分別為 \(\lfloor px \rfloor\) 和 \(x - \lfloor px \rfloor\) 的蚯蚓。特殊地,如果這兩個數的其中乙個等於 \(0\),則這個長度為 \(0\) 的蚯蚓也會被保留。此外,除了剛剛產生的兩隻新蚯蚓,其餘蚯蚓的長度都會增加 \(q\)(是乙個非負整常數)。

蛐蛐國王知道這樣不是長久之計,因為蚯蚓不僅會越來越多,還會越來越長。蛐蛐國王決定求助於一位有著洪荒之力的神秘人物,但是救兵還需要 \(m\) 秒才能到來……(\(m\) 為非負整數)

蛐蛐國王希望知道這 \(m\) 秒內的戰況。具體來說,他希望知道:

蛐蛐國王當然知道怎麼做啦!但是他想考考你……

發現先切割的一定比後切割的長度更長。所以我們可以維護三個佇列,分別儲存原序列從大到小的排序,切割後的較長一段的長度,切割後的較短一段的長度。每次取三個佇列的隊首比較大小即可。

但是發現每次加上 \(q\) 的長度很煩,於是在佇列同時維護這個長度被計算過多少次。要用到時計算即可。

時間複雜度 \(o(n+m)\)。

#include #define mp make_pair

using namespace std;

typedef long long ll;

const int n=100010;

int n,m,k,t,a,b,c,a[n];

ll num;

double p;

queue> q[4];

int main()

putchar(10);

for (int i=1,id;i<=n+m;i++)

return 0;

}

洛谷p2827蚯蚓題解

題目 演算法標籤裡的演算法什麼的都不會啊 什麼二叉堆?qbxt出去學習的時候講的,一段時間之前做的,現在才寫到部落格上的 維護3個佇列,佇列1表示最開始的蚯蚓,佇列2表示每一次被切的蚯蚓被分開的較長的那一部分,佇列3表示每一次被切的蚯蚓被分開的較短的那一部分。我們先把原序列排序,因為不管怎麼切,先被...

蚯蚓 P2827 蚯蚓

本題中,我們將用符號 c lfloor c rfloor c 表示對c向下取整,例如 3.0 3.1 3.9 3 lfloor 3.0 rfloor lfloor 3.1 rfloor lfloor 3.9 rfloor 3 3 0 3.1 3 9 3。蛐蛐國最近蚯蚓成災了!隔壁跳蚤國的跳蚤也拿蚯蚓...

洛谷P2827 蚯蚓 佇列 觀察

我們不難發現先被切開的兩半一定比後被切開的兩半大,這樣就天然的生成了佇列的單調性,就可以省去乙個log。所以,我們開三個佇列,分別為or igin big sma ll,每次查詢時將三個佇列的對頭進行比較即可。code include include include include using na...