题目描述
本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3。蛐蛐国最近蚯蚓成灾了!隔壁跳
蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓。蛐蛐国里现在共有n只蚯蚓(n为正整
数)。每只蚯蚓拥有长度,我们设第i只蚯蚓的长度为a_i(i=1,2,…,n),并保证所有的长度都是非负整数(即:可
能存在长度为0的蚯蚓)。每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只(如有多个则任选一个)
将其切成两半。神刀手切开蚯蚓的位置由常数p(是满足0
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define inf 0x7fffffff
const int N=7.2e6;
int n,m,q,u,v,t;
long long a[N],b[N],c[N];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1,cmp);
int ah=1,bh=1,ch=1,at=n,bt=0,ct=0;
for(int i=1;i<=m;i++)
{
long long mx=-inf;
int w=0;
if(ah<=at&&a[ah]>mx)
{
mx=a[ah];
w=1;
}
if(bh<=bt&&b[bh]>mx)
{
mx=b[bh];
w=2;
}
if(ch<=ct&&c[ch]>mx)
{
mx=c[ch];
w=3;
}
mx+=(i-1)*q;
if(i%t==0)
{
printf("%lld",mx);
if(i+t<=m) printf(" ");
}
switch(w)
{
case 1:ah++;break;
case 2:bh++;break;
case 3:ch++;break;
}
int x=floor(mx*u/v),y=mx-x;
x-=i*q; y-=i*q;
if(x<y) swap(x,y);
b[++bt]=x; c[++ct]=y;
for(int j=bt;j>bh&&b[j-1]<b[j];j--)
swap(b[j-1],b[j]);
for(int j=ct;j>ch&&c[j-1]<c[j];j--)
swap(c[j-1],c[j]);
}
printf("\n");
int i=0;
while(ah<=at||bh<=bt||ch<=ct)
{
i++;
long long mx=-inf;
int w=0;
if(ah<=at&&a[ah]>mx)
{
mx=a[ah];
w=1;
}
if(bh<=bt&&b[bh]>mx)
{
mx=b[bh];
w=2;
}
if(ch<=ct&&c[ch]>mx)
{
mx=c[ch];
w=3;
}
if(i%t==0)
{
printf("%lld",mx+m*q);
if(i+t<=n+m) printf(" ");
}
switch(w)
{
case 1:ah++;break;
case 2:bh++;break;
case 3:ch++;break;
}
}
return 0;
}