#185. [NOIP2016 提高组] 蚯蚓题解
#185. [NOIP2016 提高組] 蚯蚓題解
題目描述
本題中,我們將用符號(hào) ?c?\lfloor c \rfloor?c? 表示對(duì) ccc 向下取整,例如:?3.0?=?3.1?=?3.9?=3\lfloor 3.0 \rfloor = \lfloor 3.1 \rfloor = \lfloor 3.9 \rfloor = 3?3.0?=?3.1?=?3.9?=3。
蛐蛐國(guó)最近蚯蚓成災(zāi)了!隔壁跳蚤國(guó)的跳蚤也拿蚯蚓們沒(méi)辦法,蛐蛐國(guó)王只好去請(qǐng)神刀手來(lái)幫他們消滅蚯蚓。
蛐蛐國(guó)里現(xiàn)在共有 nnn 只蚯蚓(nnn 為正整數(shù))。每只蚯蚓擁有長(zhǎng)度,我們?cè)O(shè)第 iii 只蚯蚓的長(zhǎng)度為 aia_iai? (i=1,2,…,ni=1,2,\dots,ni=1,2,…,n),并保證所有的長(zhǎng)度都是非負(fù)整數(shù)(即:可能存在長(zhǎng)度為 000 的蚯蚓)。
每一秒,神刀手會(huì)在所有的蚯蚓中,準(zhǔn)確地找到最長(zhǎng)的那一只(如有多個(gè)則任選一個(gè))將其切成兩半。神刀手切開(kāi)蚯蚓的位置由常數(shù) ppp(是滿足 0<p<10 < p < 10<p<1 的有理數(shù))決定,設(shè)這只蚯蚓長(zhǎng)度為 xxx,神刀手會(huì)將其切成兩只長(zhǎng)度分別為 ?px?\lfloor px \rfloor?px? 和 x??px?x - \lfloor px \rfloorx??px? 的蚯蚓。特殊地,如果這兩個(gè)數(shù)的其中一個(gè)等于 000,則這個(gè)長(zhǎng)度為 000 的蚯蚓也會(huì)被保留。此外,除了剛剛產(chǎn)生的兩只新蚯蚓,其余蚯蚓的長(zhǎng)度都會(huì)增加 qqq(是一個(gè)非負(fù)整常數(shù))。
蛐蛐國(guó)王知道這樣不是長(zhǎng)久之計(jì),因?yàn)轵球静粌H會(huì)越來(lái)越多,還會(huì)越來(lái)越長(zhǎng)。蛐蛐國(guó)王決定求助于一位有著洪荒之力的神秘人物,但是救兵還需要 mmm 秒才能到來(lái)……(mmm 為非負(fù)整數(shù))
蛐蛐國(guó)王希望知道這 mmm 秒內(nèi)的戰(zhàn)況。具體來(lái)說(shuō),他希望知道:
- mmm 秒內(nèi),每一秒被切斷的蚯蚓被切斷前的長(zhǎng)度(有 mmm 個(gè)數(shù));
- mmm 秒后,所有蚯蚓的長(zhǎng)度(有 n+mn + mn+m 個(gè)數(shù))。
蛐蛐國(guó)王當(dāng)然知道怎么做啦!但是他想考考你……
輸入格式
第一行包含六個(gè)整數(shù) n,m,q,u,v,tn,m,q,u,v,tn,m,q,u,v,t,其中:n,m,qn,m,qn,m,q 的意義見(jiàn)【問(wèn)題描述】;u,v,tu,v,tu,v,t 均為正整數(shù);你需要自己計(jì)算 p=u/vp=u / vp=u/v(保證 0<u<v0 < u < v0<u<v);ttt 是輸出參數(shù),其含義將會(huì)在【輸出格式】中解釋。
第二行包含 nnn 個(gè)非負(fù)整數(shù),為 a1,a2,…,ana_1, a_2, \dots, a_na1?,a2?,…,an?,即初始時(shí) nnn 只蚯蚓的長(zhǎng)度。
同一行中相鄰的兩個(gè)數(shù)之間,恰好用一個(gè)空格隔開(kāi)。
保證 1≤n≤1051 \leq n \leq 10^51≤n≤105,0≤m≤7×1060 \leq m \leq 7 \times 10^60≤m≤7×106,0<u<v≤1090 < u < v \leq 10^90<u<v≤109,0≤q≤2000 \leq q \leq 2000≤q≤200,1≤t≤711 \leq t \leq 711≤t≤71,0≤ai≤1080 \leq a_i \leq 10^80≤ai?≤108。
輸出格式
第一行輸出 ?mt?\left \lfloor \frac{m}{t} \right \rfloor?tm?? 個(gè)整數(shù),按時(shí)間順序,依次輸出第 ttt 秒,第 2t2t2t 秒,第 3t3t3t 秒,……被切斷蚯蚓(在被切斷前)的長(zhǎng)度。
第二行輸出 ?n+mt?\left \lfloor \frac{n+m}{t} \right \rfloor?tn+m?? 個(gè)整數(shù),輸出 mmm 秒后蚯蚓的長(zhǎng)度;需要按從大到小的順序,依次輸出排名第 ttt,第 2t2t2t,第 3t3t3t,……的長(zhǎng)度。
同一行中相鄰的兩個(gè)數(shù)之間,恰好用一個(gè)空格隔開(kāi)。即使某一行沒(méi)有任何數(shù)需要輸出,你也應(yīng)輸出一個(gè)空行。
請(qǐng)閱讀樣例來(lái)更好地理解這個(gè)格式。
樣例 #1
樣例輸入 #1
3 7 1 1 3 1 3 3 2樣例輸出 #1
3 4 4 4 5 5 6 6 6 6 5 5 4 4 3 2 2樣例 #2
樣例輸入 #2
3 7 1 1 3 2 3 3 2樣例輸出 #2
4 4 5 6 5 4 3 2樣例 #3
樣例輸入 #3
3 7 1 1 3 9 3 3 2樣例輸出 #3
//空行 2提示
【樣例解釋1】
在神刀手到來(lái)前:333只蚯蚓的長(zhǎng)度為3,3,23,3,23,3,2。
111秒后:一只長(zhǎng)度為333的蚯蚓被切成了兩只長(zhǎng)度分別為111和222的蚯蚓,其余蚯蚓的長(zhǎng)度增加了111。最終444只蚯蚓的長(zhǎng)度分別為(1,2),4,3(1,2),4,3(1,2),4,3。括號(hào)表示這個(gè)位置剛剛有一只蚯蚓被切斷
222秒后:一只長(zhǎng)度為444的蚯蚓被切成了111和333。555只蚯蚓的長(zhǎng)度分別為:2,3,(1,3),42,3,(1,3),42,3,(1,3),4。
3秒后:一只長(zhǎng)度為444的蚯蚓被切斷。666只蚯蚓的長(zhǎng)度分別為:3,4,2,4,(1,3)3,4,2,4,(1,3)3,4,2,4,(1,3)。
444秒后:一只長(zhǎng)度為444的蚯蚓被切斷。777只蚯蚓的長(zhǎng)度分別為:4,(1,3),3,5,2,44,(1,3),3,5,2,44,(1,3),3,5,2,4。
555秒后:一只長(zhǎng)度為555的蚯蚓被切斷。888只蚯蚓的長(zhǎng)度分別為:5,2,4,4,(1,4),3,55,2,4,4,(1,4),3,55,2,4,4,(1,4),3,5。
666秒后:一只長(zhǎng)度為555的蚯蚓被切斷。999只蚯蚓的長(zhǎng)度分別為:(1,4),3,5,5,2,5,4,6(1,4),3,5,5,2,5,4,6(1,4),3,5,5,2,5,4,6。
777秒后:一只長(zhǎng)度為666的蚯蚓被切斷。101010只蚯蚓的長(zhǎng)度分別為:2,5,4,6,6,3,6,5,(2,4)2,5,4,6,6,3,6,5,(2,4)2,5,4,6,6,3,6,5,(2,4)。所以,777秒內(nèi)被切斷的蚯蚓的長(zhǎng)度依次為3,4,4,4,5,5,63,4,4,4,5,5,63,4,4,4,5,5,6。777秒后,所有蚯蚓長(zhǎng)度從大到小排序?yàn)?span id="ozvdkddzhkzd" class="katex--inline">6,6,6,5,5,4,4,3,2,26,6,6,5,5,4,4,3,2,26,6,6,5,5,4,4,3,2,2
【樣例解釋2】
這個(gè)數(shù)據(jù)中只有t=2t=2t=2與上個(gè)數(shù)據(jù)不同。只需在每行都改為每?jī)蓚€(gè)數(shù)輸出一個(gè)數(shù)即可。
雖然第一行最后有一個(gè)666沒(méi)有被輸出,但是第二行仍然要重新從第二個(gè)數(shù)再開(kāi)始輸出。
【樣例解釋3】
這個(gè)數(shù)據(jù)中只有t=9t=9t=9與上個(gè)數(shù)據(jù)不同。
注意第一行沒(méi)有數(shù)要輸出,但也要輸出一個(gè)空行。
【數(shù)據(jù)范圍】
思路
說(shuō)實(shí)話,題目廢話真多,咳咳,這道題吧,在某谷上的標(biāo)是提高+,省選-,不過(guò)吧其實(shí)沒(méi)那么難,只需要使用一個(gè)優(yōu)先隊(duì)列即可,但是吧,又不完全是這樣,不要問(wèn)我是怎么知道的,你需要使用一點(diǎn)小小的公式呢
-
對(duì)于兩條蚯蚓a,b, 若a先被切為x,y兩條蚯蚓(設(shè)lenx<leny), 而b后被切為u,v兩條蚯蚓(設(shè)lenu ≤lenv), 則在b被切完后的任意時(shí)刻, 均有l(wèi)enx<lenu; leny < lenv
至于證明吧,就不需要了,相信大家!!(其實(shí)就是不想寫(xiě)了
實(shí)現(xiàn)細(xì)節(jié)
記得double類型和int類型之間的轉(zhuǎn)換和關(guān)系
注意語(yǔ)言選c++14以下的
code
#include <bits/stdc++.h> using namespace std; double m,Q,u,v; int t,n; int cnt=0,tot=0,num=1; double p; int dd; int ans1[(int)7e6+5]; int a[(int)7e6+5]; queue<int>q1; queue<int>q2; queue<int>q3; inline int read() {int X = 0, F = 1;char C = getchar();while (C < '0' || C>'9') {if (C == '-') {F = -1;}C = getchar();}while (C >= '0' && C <= '9') {X = (X << 3) + (X << 1) + C - '0';C = getchar();}return X * F; } inline void write(int N) {if (N < 0) {putchar('-');N = -N;}if (N >= 10) {write(N / 10);}putchar(N % 10 + '0'); } inline int Get() {int x1=INT_MIN,x2=INT_MIN,x3=INT_MIN;if(!q1.empty())x1=q1.front();if(!q2.empty())x2=q2.front();if(!q3.empty())x3=q3.front();if(x1>=x2&&x1>=x3) {q1.pop();return x1;} else if(x2>=x3) {q2.pop();return x2;} else {q3.pop();return x3;} }//那個(gè)公式 int main() {n=read();m=read();Q=read();u=read();v=read();t=read();p=(double)u/v;for(register int i=1; i<=n; ++i) {ans1[i]=read();}sort(ans1+1,ans1+n+1, greater<int>());//排序后再壓入for(register int i=1;i<=n;i++){q1.push(ans1[i]);}int tag=0;for(register int i=1; i<=m; ++i) {int d=Get();d+=tag;a[i]=d;int tad=d*p;q2.push(tad-tag-Q);//截?cái)嗪蟮牡谝还?jié)q3.push(d-tad-tag-Q);//第二節(jié)tag+=Q;}for(register int i=t; i<=m; i+=t) {write(a[i]);printf(" ");}puts("");while(!q1.empty()||!q2.empty()||!q3.empty()) {int u=Get();if(num%t==0) {write(u+tag);//因?yàn)榍懊鏈p了一個(gè)tag,現(xiàn)在加上printf(" ");}num++;}return 0; }總結(jié)
以上是生活随笔為你收集整理的#185. [NOIP2016 提高组] 蚯蚓题解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【OpenCV 例程 300 篇】105
- 下一篇: 机械键盘基础知识