洛谷P2827 蚯蚓 單調佇列

2022-04-30 04:33:12 字數 1443 閱讀 7719

初始時有$n$個蚯蚓,每個長度為$a[i]$

有$m$個時間,每個時間點找出長度最大的蚯蚓,把它切成兩段,分別為$a[i] * p$和$a[i] - a[i] * p$,除這兩段外其他的長度都加乙個定值$q$。

每次詢問被蚯蚓被切前的長度

用堆模擬可獲得$50 - 85$不等的分數。

蚯蚓的長度有單調性。然後這題就做完了。。。

首先把$a[i]$排序

我們分別維護三個陣列$a, b, c$,分別表示未被切的蚯蚓,被切成$p * a[i]$的蚯蚓和被切成$a[i] - p * a[i]$的蚯蚓

然後每次取出這三個裡面最大的,切開之後再插回去就行了

大概口胡一下單調性的證明:

這題中最重要的兩個條件是$a_i$有序以及$0 < p < 1$

首先$a_i$有單調性是顯然的

考慮$b, c$中的元素一定是按照從小到大的順序加入的,且不受全域性標記的影響。

#include#include

#include

#include

const

int maxn = 1e7 + 10, inf = 1e9 + 10

;using

namespace

std;

inline

intread()

while(c >= '

0' && c <= '

9') x = x * 10 + c - '

0', c =getchar();

return x *f;

}int

n, m, all, t, u, v, a[maxn], p;

queue

q[3

];bool comp(const

int &a, const

int &b)

intmain()

int val = -inf, mx = 0

;

for(int j = 0; j < 3; j++)

if(!q[j].empty() && q[j].front() > val) mx = j, val =q[j].front();

int top =val; q[mx].pop();

if(!(i % t)) printf("

%d ", val +cur);

q[1].push(1ll * (top + cur) * u / v - cur -all);

q[2].push((top + cur) - 1ll * (top + cur) * u / v - cur -all);

cur +=all;

}puts(

"");

priority_queue

ans;

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

return0;

}

洛谷P2827 蚯蚓

本題中,我們將用符號 lfloor c rfloor 表示對 c 向下取整,例如 lfloor 3.0 rfloor lfloor 3.1 rfloor lfloor 3.9 rfloor 3 蛐蛐國最近蚯蚓成災了!隔壁跳蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去請神刀手來幫他們消滅蚯蚓。蛐蛐國裡現...

洛谷P2827 蚯蚓 佇列 觀察

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

洛谷p2827蚯蚓題解

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