Description
本題中,我們將用符號[c]表示對c向下取整,例如:[3.0」= [3.1」=[3.9」=3。蛐蛐國最近蚯蚓成災了!隔壁跳
蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去請神刀手來幫他們消滅蚯蚓。蛐蛐國裏現在共有n只蚯蚓(n爲正整
數)。每隻蚯蚓擁有長度,我們設第i只蚯蚓的長度爲a_i(i=1,2,…,n),並保證所有的長度都是非負整數(即:可
能存在長度爲0的蚯蚓)。每一秒,神刀手會在所有的蚯蚓中,準確地找到最長的那一隻(如有多個則任選一個)
將其切成兩半。神刀手切開蚯蚓的位置由常數p(是滿足0
Input
第一行包含六個整數n,m,q,u,v,t,其中:n,m,q的意義見問題描述;
u,v,t均爲正整數;你需要自己計算p=u/v(保證0
Output
第一行輸出[m/t]個整數,按時間順序,依次輸出第t秒,第2t秒,第3t秒……被切斷蚯蚓(在被切斷前)的長度。
第二行輸出[(n+m)/t]個整數,輸出m秒後蚯蚓的長度;需要按從大到小的順序
依次輸出排名第t,第2t,第3t……的長度。
同一行中相鄰的兩個數之間,恰好用一個空格隔開。即使某一行沒有任何數需要 輸出,你也應輸出一個空行。
請閱讀樣例來更好地理解這個格式。
Sample Input
3 7 1 1 3 1
3 3 2
Sample Output
3 4 4 4 5 5 6
6 6 6 5 5 4 4 3 2 2
分析
就是建立三個單調隊列,①是放原來的長度,②放是砍了之後較長的那一截,③就是放較短的那一截。每一次看的就是隊頭中最長的那一條蚯蚓,砍了之後就分別放到②和③裏
代碼
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
#define M -2000000000
using namespace std;
bool cmp(int x,int y)
{
return x>y;
}
long long a[3][1000];
long long maxn;
int n,m,q,u,v,t;
int head[3],tail[3];
long long x,y,tt;
int main()
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
for (int i=1;i<=n+m;i++)
a[0][i]=a[1][i]=a[2][i]=M;
for (int i=1;i<=n;i++)
scanf("%lld",&a[0][i]);
sort(a[0]+1,a[0]+1+n,cmp);
tail[0]=n;
tail[1]=0;
tail[2]=0;
head[1]=0;
head[2]=0;
head[0]=1;
for (int i=1;i<=m;i++)
{
maxn=M;
int k=0;
for (int j=0;j<=2;j++)
if (a[j][head[j]]>maxn)
{
maxn=a[j][head[j]];
k=j;
}
tt=0;
tt=maxn+(i-1)*q;
if (i%t==0) printf("%lld " ,&tt);
head[k]++;
x=tt*u/v;
y=tt-x;
a[1][++tail[1]]=x-i*q;
a[2][++tail[2]]=y-i*q;
}
printf("\n");
for (int i=1;i<=m+n;i++)
{
maxn=M;
int k=0;
for (int j=0;j<=2;j++)
if (a[j][head[j]]>maxn)
{
maxn=a[j][head[j]];
k=j;
}
tt=0;
tt=maxn+m*q;
if(i%t==0) printf("%lld " ,&tt);
head[k]++;
}
}