NOIP2016蚯蚓(洛谷2827)

2021-08-07 23:35:17 字數 1532 閱讀 2875

標籤:佇列,模擬

【題目描述】

本題中,我們將用符號[c]表示對c向下取整,例如:[3.0」= [3.1」= [3.9」=3。

蛐蛐國最近蚯蚓成災了!隔壁跳蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去請神刀手來幫他們消滅蚯蚓。

蛐蛐國裡現在共有n只蚯蚓(n為正整數)。每只蚯蚓擁有長度,我們設第i只蚯蚓的長度為a_i(i=1,2,…,n),並保證所有的長度都是非負整數(即:可能存在長度為0的蚯蚓)。

每一秒,神刀手會在所有的蚯蚓中,準確地找到最長的那乙隻(如有多個則任選乙個)將其切成兩半。神刀手切開蚯蚓的位置由常數p(是滿足0< p<1的有理數)決定,設這只蚯蚓長度為x,神刀手會將其切成兩隻長度分別為[px]和x-[px]的蚯蚓。特殊地,如果這兩個數的其中乙個等於0,則這個長度為0的蚯蚓也會被保留。此外,除了剛剛產生的兩隻新蚯蚓,其餘蚯蚓的長度都會增加q(是乙個非負整常數)。

蛐蛐國王知道這樣不是長久之計,因為蚯蚓不僅會越來越多,還會越來越長。蛐蛐國王決定求助於一位有著洪荒之力的神秘人物,但是救兵還需要m秒才能到來……

(m為非負整數)

蛐蛐國王希望知道這m秒內的戰況。具體來說,他希望知道:

•m秒內,每一秒被切斷的蚯蚓被切斷前的長度(有m個數)

•m秒後,所有蚯蚓的長度(有n+m個數)。

蛐蛐國王當然知道怎麼做啦!但是他想考考你……

【輸入格式】

第一行包含六個整數n,m,q,u,v,t,其中:n,m,q的意義見【題目描述】;u,v,t均為正整數;你需要自己計算p=u/v(保證0< u< v)t是輸出引數,其含義將會在【輸出格式】中解釋。

第二行包含n個非負整數,為ai,a2,…,an,即初始時n只蚯蚓的長度。

同一行中相鄰的兩個數之間,恰好用乙個空格隔開。

保證1<=n<=10^5,0

分析:我們發現蚯蚓的切割具有單調性,在某一時刻切割的蚯蚓,一定會比在它之後切割的蚯蚓要長

考慮記錄三個佇列,分別儲存未切割過的蚯蚓和切割成的兩隻蚯蚓,每次將蚯蚓插入對應的隊尾。根據我們上面推論得出的單調性,每次取出三個隊頭的最大值即可,蚯蚓長度的增加和上述堆做法的處理方式相同,這樣的總複雜為o(n+m)

維護三個單調佇列即可,轉化為模擬的問題了

參考**

includeusing namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}const int maxn=100005,inf=1e9;

int q,d1[maxn],f1=1,d2[maxn*105],f2=1,l2=0,d3[maxn*105],f3=1,l3=0,flag;

int n,m,u,v,t,kk,temp;

double p;

int cmp(int x,int y)

int choose(int x,int y,int z)

{

if(f1>n)x=-inf;

if(f2>l2)y=-inf;

if(f3>l3)z=-inf;

if(x

NOIP 2016 蚯蚓(洛谷 P2827)

本題中,我們將用符號 c 表示對c向下取整,例如 3.0 3.1 3.9 3。蛐蛐國最近蚯蚓成災了!隔壁跳蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去請神刀手來幫他們消滅蚯蚓。蛐蛐國裡現在共有n只蚯蚓 n為正整數 每只蚯蚓擁有長度,我們設第i只蚯蚓的長度為a i i 1,2,n 並保證所有的長度都是非...

noip2016 洛谷P2827 蚯蚓

這個題只知道可以用優先佇列去做,但是不知道正解想法,看到題解後恍然大悟,詳情請看 中間 include include include include include using namespace std int n,m,q,u,v,t,q1 8000010 q2 8000010 q3 80000...

NOIP2016 蚯蚓 亂搞

description 你有n個線段,每一秒你要拿出來最長的乙個線段切成兩段長度為 p u lfloor rfloor p u 和u p u u lfloor rfloor u p u 兩段 其中u是線段長,p是乙個大於0小於1的實數 沒被切的線段長度加q。問和第k秒的切割線段切割前的長度和m秒後的...