AcWing133. 蚯蚓
題目:
蛐蛐國最近蚯蚓成災了!
隔壁跳蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去請神刀手來幫他們消滅蚯蚓。
蛐蛐國里現在共有?nn?只蚯蚓,第?ii?只蚯蚓的長度為?aiai?,所有蚯蚓的長度都是非負整數,即可能存在長度為?00?的蚯蚓。
每一秒,神刀手會在所有的蚯蚓中,準確地找到最長的那一只,將其切成兩段。
若有多只最長的,則任選一只。
神刀手切開蚯蚓的位置由有理數?pp?決定。
一只長度為?xx?的蚯蚓會被切成兩只長度分別為??px??px??和?x??px?x??px??的蚯蚓。
特殊地,如果這兩個數的其中一個等于?00,則這個長度為?00?的蚯蚓也會被保留。
此外,除了剛剛產生的兩只新蚯蚓,其余蚯蚓的長度都會增加一個非負整數?qq。
蛐蛐國王知道這樣不是長久之計,因為蚯蚓不僅會越來越多,還會越來越長。
蛐蛐國王決定求助于一位有著洪荒之力的神秘人物,但是救兵還需要?mm?秒才能到來。
蛐蛐國王希望知道這?mm?秒內的戰況。
具體來說,他希望知道:
輸入格式
第一行包含六個整數?n,m,q,u,v,tn,m,q,u,v,t,其中:n,m,qn,m,q?的意義參考題目描述;u,v,tu,v,t?均為正整數;你需要自己計算?p=u/vp=u/v(保證?0<u<v0<u<v);tt?是輸出參數,其含義將會在輸出格式中解釋。
第二行包含?nn?個非負整數,為?a1,a2,…,ana1,a2,…,an,即初始時?nn?只蚯蚓的長度。
同一行中相鄰的兩個數之間,恰好用一個空格隔開。
輸出格式
第一行輸出??m/t??m/t??個整數,按時間順序,依次輸出第?tt?秒,第?2t2t?秒,第?3t3t?秒,……被切斷蚯蚓(在被切斷前)的長度。
第二行輸出??(n+m)/t??(n+m)/t??個整數,輸出?mm?秒后蚯蚓的長度;需要按從大到小的順序,依次輸出排名第?tt,第?2t2t,第?3t3t,……的長度。
同一行中相鄰的兩個數之間,恰好用一個空格隔開。
即使某一行沒有任何數需要輸出,你也應輸出一個空行。
請閱讀樣例來更好地理解這個格式。
數據范圍
1≤n≤1051≤n≤105,
0≤ai≤1080≤ai≤108,
0<p<10<p<1,
0≤q≤2000≤q≤200,
0≤m≤7?1060≤m≤7?106,
0<u<v≤1090<u<v≤109,
1≤t≤711≤t≤71
輸入樣例:
3 7 1 1 3 1
3 3 2
輸出樣例:
3 4 4 4 5 5 6
6 6 6 5 5 4 4 3 2 2
樣例解釋
樣例中,在神刀手到來前:33?只蚯蚓的長度為?3,3,23,3,2。
11?秒后:一只長度為?33?的蚯蚓被切成了兩只長度分別為?11?和?22?的蚯蚓,其余蚯蚓的長度增加了?11。最終?44?只蚯蚓的長度分別為?(1,2),4,3(1,2),4,3。 括號表示這個位置剛剛有一只蚯蚓被切斷。
22?秒后:一只長度為?44?的蚯蚓被切成了?11?和?33。55?只蚯蚓的長度分別為:2,3,(1,3),42,3,(1,3),4。
33?秒后:一只長度為?44?的蚯蚓被切斷。66?只蚯蚓的長度分別為:3,4,2,4,(1,3)3,4,2,4,(1,3)。
44?秒后:一只長度為?44?的蚯蚓被切斷。77?只蚯蚓的長度分別為:4,(1,3),3,5,2,44,(1,3),3,5,2,4。
55?秒后:一只長度為?55?的蚯蚓被切斷。88?只蚯蚓的長度分別為:5,2,4,4,(1,4),3,55,2,4,4,(1,4),3,5。
66?秒后:一只長度為?55?的蚯蚓被切斷。99?只蚯蚓的長度分別為:(1,4),3,5,5,2,5,4,6(1,4),3,5,5,2,5,4,6。
77?秒后:一只長度為?66?的蚯蚓被切斷。1010?只蚯蚓的長度分別為:2,5,4,6,6,3,6,5,(2,4)2,5,4,6,6,3,6,5,(2,4)。
所以,77?秒內被切斷的蚯蚓的長度依次為?3,4,4,4,5,5,63,4,4,4,5,5,6。
77?秒后,所有蚯蚓長度從大到小排序為?6,6,6,5,5,4,4,3,2,26,6,6,5,5,4,4,3,2,2。
這道題麻煩在q>=0;如果說他是q=0,那么就可以直接用優先隊列來做(簡單很多)。
這個題目有一個難想到的地方,就是每次砍斷一條蚯蚓,其他的蚯蚓都要加上q,我們不可能把優先隊列中的數全部取出,然后都加上q這樣的就會超時。有一個方法:就是把砍斷的蚯蚓減去q先對于其他的就是增加了q,但是要把這個q用sq=0加起來->sq+=q,每次拿出一個數的時候就要加上sq讓他還原成原來的數的大小,得到的兩端蚯蚓要減去-(sq+q)(理解相對這個概念);
下面的是優先隊列得到代碼(代碼是超時的,但是還是很有借鑒意義)時間復雜度為
O(mlogn)
下面就要,優化一下代碼,總結出一個規律,例如:x1>x2,當x1背切成l1,r1時;
X2+q,然后當x2被切成l2,r2時l1+q,r1+q;都沒有背切時,l1>l2;r1>r2,之后l1和r1都是加了一個q,但是l2,r2兩個加起來的和才是q,因此我們可以得到兩個單調數組用q2存l,用q2存r,每次我們只要比較q1,q2和原來數組中最大的數——>得到最大的數;每次去最大數操作的復雜度時O(1),總的時間復雜度是O(nlogn+m)。
下面是代碼:
總結
以上是生活随笔為你收集整理的AcWing133. 蚯蚓的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MATLAB】解一元一次(一元二次)方
- 下一篇: 飞思卡尔MC9S12系列单片机地址影射以