NOIP2016 蚯蚓 亂搞

2021-08-28 10:35:25 字數 1661 閱讀 9563

description

你有n個線段,每一秒你要拿出來最長的乙個線段切成兩段長度為⌊p∗

u⌋

\lfloor\rfloor

⌊p∗u⌋和u−⌊

p∗u⌋

u-\lfloor\rfloor

u−⌊p∗u

⌋兩段(其中u是線段長,p是乙個大於0小於1的實數)沒被切的線段長度加q。問和第k秒的切割線段切割前的長度和m秒後的n+m條線段的長度。

sample input

3 7 1 1 3 1

3 3 2

sample output

3 4 4 4 5 5 6

6 6 6 5 5 4 4 3 2 2

我們開三個序列維護。

第乙個序列存原數,第二個序列存⌊p∗

u⌋

\lfloor\rfloor

⌊p∗u

⌋,第三個序列存u−⌊

p∗u⌋

u-\lfloor\rfloor

u−⌊p∗u

⌋。每次取三個佇列隊頭最大值即可,易證不說了。

#include

#include

#include

using

namespace std;

typedef

long

long ll;

int_min

(int x,

int y)

int_max

(int x,

int y)

intread()

while

(ch >=

'0'&& ch <=

'9') s = s *

10+ ch -

'0', ch =

getchar()

;return s * f;

}void

put(

int x)

int num =0;

char c[15]

;while

(x) c[

++num]

=(x %10)

+'0'

, x /=10

;while

(num)

putchar

(c[num--])

;}int len, a[

110000];

int q[3]

[7100001

], l[3]

, r[3]

;int

main()

else

if(h2 >= h1 && h2 >= h3)

else

if(i % t ==

0&& i != m / t * t)

putchar

(' ');

}puts(""

);for(

int i =

1; i <= n + m; i++

)else

if(h2 >= h1 && h2 >= h3)

else

if(i % t ==

0&& i !=

(n + m)

/ t * t)

putchar

(' ');

}return0;

}

noip2016 蚯蚓 佇列

傳送門 樣例1 3 7 1 1 3 1 3 3 2 樣例2 3 7 1 1 3 2 3 3 2 樣例3 3 7 1 1 3 9 3 3 2 樣例1 3 4 4 4 5 5 6 6 6 6 5 5 4 4 3 2 2 樣例2 4 4 5 6 5 4 3 2 樣例3 空行 很顯然是一道優先佇列的題0 0...

noip2016 蚯蚓 佇列

傳送門 樣例1 3 7 1 1 3 1 3 3 2 樣例2 3 7 1 1 3 2 3 3 2 樣例3 3 7 1 1 3 9 3 3 2 樣例1 3 4 4 4 5 5 6 6 6 6 5 5 4 4 3 2 2 樣例2 4 4 5 6 5 4 3 2 樣例3 空行 很顯然是一道優先佇列的題0 0...

NOIp2016 蚯蚓 佇列

link 這道題是個 zz 題 我們考慮如何得部分分,即十分 zz 的 theta m n log m n 窩萌發現這個複雜度似乎可以接受,但是會爆是真的,所以每當這個時候我們就需要思考問題內部的單調性。我們發現其實對於兩條蚯蚓 a 和 b 設它們的長度為 l a 和 l b 假設他們滿足 l a ...