題目鏈結
給出 n 個蚯蚓,現在要執行 m 次切蚯蚓的操作,每次操作如下:
選擇乙個最長的蚯蚓 \(l\),如果有多個最長的,那就隨便選乙個,將這條蚯蚓切成兩段長為現在問 m 次切的蚯蚓長度是多少,以及 m 次操作後,所有的蚯蚓長度。\(\lfloor l*p \rfloor\),\(l-\lfloor l*p \rfloor\) 的蚯蚓。除了這兩條新增加的蚯蚓,其他的蚯蚓會增加長度 \(q\)。
題目中說除了新增的兩條蚯蚓,其他的蚯蚓會都會增加長度 \(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行,每行輸入乙個...