演算法高階指南 蚯蚓 佇列

2022-06-27 17:57:15 字數 1949 閱讀 3920

題目鏈結

給出 n 個蚯蚓,現在要執行 m 次切蚯蚓的操作,每次操作如下:

選擇乙個最長的蚯蚓 \(l\),如果有多個最長的,那就隨便選乙個,將這條蚯蚓切成兩段長為

\(\lfloor l*p \rfloor\),\(l-\lfloor l*p \rfloor\) 的蚯蚓。除了這兩條新增加的蚯蚓,其他的蚯蚓會增加長度 \(q\)。

現在問 m 次切的蚯蚓長度是多少,以及 m 次操作後,所有的蚯蚓長度。

題目中說除了新增的兩條蚯蚓,其他的蚯蚓會都會增加長度 \(q\),乙個乙個去增加肯定不行。

可以用乙個優先佇列來存放蚯蚓長度,當切蚯蚓的時候,我們把新產生的蚯蚓長度減去 \(i*q\) ,放入優先佇列中。

優先佇列中的值 + \((i-1)*q\)就是第 \(i\) 次切蚯蚓的時候,蚯蚓的長度。

這樣我們就可以知道題目中要求的東西。

但是由於m太大,用優先佇列複雜度有點高。

假如現在有兩個蚯蚓長度分別為 \(x_1\) ,\(x_2\), \(x_1>x_2\)

第一次切完產生兩條長度為 \(p \times x_1\),\(x_1-p\times x_1\)

假如說第二次切的是 \(x_2\),會產生兩個長度為 \(p \times (x_2+q)\),\(x_2+q-p\times (x_2+q)\)

這時第一次切的蚯蚓長度變為了\(p \times x_1+q\),\(x_1-p\times x_1+q\)

可以看出 \(x_1\)切過的長度是大於\(x_2\)切過的長度的。

那麼也就是新產生的蚯蚓的長度是單調遞減的。

我們就可以用三個佇列分別維護,原來 \(n\) 個蚯蚓的長度,和新產生的兩個蚯蚓的長度。

每次取三個佇列的頭部的最大值。

配合優先佇列的思路。

複雜度為 \(o(m+nlog n)\)

#include #include #include #include #include #include #define pb push_back

typedef long long ll;

const int inf = 0x3f3f3f3f;

const int n = 2e5 + 10;

const int mod = 1e9 + 7;

using namespace std;

vectorans;

int cmp(int a, int b)

int arr[n];

queueq1, q2, q3;

int main()

sort(arr + 1, arr + 1 + n);

for (int i = n; i; i--)

for (int i = 1; i <= m; i++)

if (!q2.empty())

if (!q3.empty())

if (!q1.empty() && now == q1.front()) else if (!q2.empty() && now == q2.front()) else

now += (i - 1) * q;

if (i % t == 0)

int temp = int(1ll * u * now / v);

q2.push(temp - i * q), q3.push(now - temp - i * q);

}printf("\n");

while (!q1.empty())

while (!q2.empty())

while (!q3.empty())

sort(ans.begin(), ans.end(), cmp);

for (int i = t; i <= ans.size(); i += t)

printf("\n");

return 0;}/*

*/

《演算法競賽高階指南》蚯蚓

蛐蛐國最近蚯蚓成災了!隔壁跳蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去請神刀手來幫他們消滅蚯蚓。蛐蛐國裡現在共有 n 只蚯蚓,第 i 只蚯蚓的長度為 ai 所有蚯蚓的長度都是非負整數,即可能存在長度為0的蚯蚓。每一秒,神刀手會在所有的蚯蚓中,準確地找到最長的那乙隻,將其切成兩段。若有多隻最長的,則任...

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

m次操作,每次都要將乙個最大的切成兩段,然後再加上乙個偏移量,然後將兩段全部放入佇列中,但是這樣是o mlogm 看題中資料範圍肯定會超時,那麼我就要繼續優化 我們可以發現,先將原序列從大到小排列 q1,q2,q3,q4 第一次肯定是切割q1,假設將q1切成了q1l,q1r,那麼對於第二次切割只需要...

《演算法競賽高階指南》小組佇列

有n個小組要排成乙個佇列,每個小組中有若干人。當乙個人來到佇列時,如果佇列中已經有了自己小組的成員,他就直接插隊排在自己小組成員的後面,否則就站在隊伍的最後面。請你編寫乙個程式,模擬這種小組佇列。輸入格式 輸入將包含乙個或多個測試用例。對於每個測試用例,第一行輸入小組數量t。接下來t行,每行輸入乙個...