初始時有$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表示每一次被切的蚯蚓被分開的較短的那一部分。我們先把原序列排序,因為不管怎麼切,先被...