日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

#185. [NOIP2016 提高组] 蚯蚓题解

發(fā)布時(shí)間:2024/3/12 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 #185. [NOIP2016 提高组] 蚯蚓题解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

#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^51n1050≤m≤7×1060 \leq m \leq 7 \times 10^60m7×1060<u<v≤1090 < u < v \leq 10^90<u<v1090≤q≤2000 \leq q \leq 2000q2001≤t≤711 \leq t \leq 711t710≤ai≤1080 \leq a_i \leq 10^80ai?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)度分別為111222的蚯蚓,其余蚯蚓的長(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的蚯蚓被切成了111333555只蚯蚓的長(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,6777秒后,所有蚯蚓長(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。