P2827 NOIP2016 提高組 佇列

2021-10-17 15:28:52 字數 1134 閱讀 7658

題意

傳送門 p2827 [noip2016 提高組] 蚯蚓

題解容易想到使用二叉堆維護長度的最大值,由於每次新產生之外的蚯蚓長度都增加 q

qq,而難以修改已經在堆中的元素,那麼對新產生的蚯蚓長度減 q

qq,可以使長度的相互關係保持不變。時間複雜度 o(m

log⁡n)

o(m\log n)

o(mlogn)

,顯然難以勝任。

設當前切割蚯蚓長度為 x

1x_1

x1​,那麼新增蚯蚓長度分別為 ⌊px

1⌋

\lfloor px_1\rfloor

⌊px1​⌋

與 x1−⌊

px1⌋

x_1-\lfloor px_1\rfloor

x1​−⌊p

x1​⌋

。那麼下一次可能的切割蚯蚓顯然為之前未切割的蚯蚓的長度最大值與新增蚯蚓長度,假設下一次切割的蚯蚓長度為 x

2x_2

x2​,那麼有 x1≥

x2

x_1\geq x_2

x1​≥x2

​,且滿足

\lfloor px_1\rfloor+q=\lfloor px_1+q\rfloor\geq \lfloor p(x_2+q)\rfloor \\ x_1-\lfloor px_1\rfloor+q\geq x_1-\lfloor p(x_1+q)\rfloor+q\geq x_2-\lfloor p(x_2+q)\rfloor+q\\ \end

intmain()

for(

int i =

1; i <= n + m;

++i)

rem[i]

=get()

+ d;

for(

int i = t; i <= m; i +

= t)

printf

("%d "

, cut[i]);

puts(""

);for(

int i = t; i <= m + n; i +

= t)

printf

("%d "

, rem[i]);

puts(""

);return0;

}

洛谷P2827 NOIP2016 提高組 蚯蚓

題鏈 最長的蚯蚓被砍兩截之後,其餘的蚯蚓長度會增加,與其加其餘蚯蚓不如對這兩隻蚯蚓操作,可定義乙個buff表示其餘蚯蚓需要增加多少長度,當拿出最長的那只蚯蚓時,就需要加上buff,當然被剪斷的變成兩條就需要減去當前buff再壓入佇列,保證下次拿出來時加上buff是應有的長度 乙個佇列存原陣列,另外兩...

洛谷P2827,NOIP2016 蚯蚓

傳送門 考慮優先佇列 但是蚯蚓的長度是變化的,如果每一次操作都修改所有蚯蚓的長度,必然超時.但是每一次所有蚯蚓中,只有被斬斷生成的兩個沒有 q,其它所有蚯蚓長度均 q.不難想到,用優先佇列 兩個值 len表示被壓入優先佇列時的長度,t表示被壓入優先佇列的時間,如果當前時間為i,那麼當前蚯蚓的實際長度...

洛谷P2827 NOIP2016 蚯蚓

題目描述 輸入 輸出 思路分析 70分寫法 看到每次取出最大值,第一眼想到的就是優先佇列,我們可以每一次取完隊首元素後將其分開後兩段的長度進行計算,再放入佇列之中即可 但題目中要求,除被切開的蚯蚓外,其餘蚯蚓長度要變長,每次把隊中元素取出並加上q再放入隊中?不用說我們也知道這是不行的,那我們可以 考...