標籤:佇列,模擬
【題目描述】
本題中,我們將用符號[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秒後的...