Description
Data Constraint
Solution
我们先讨论一下假设有两条蚯蚓x,y(x>y),那么分别切完他们后最终的长度分别为p*x+q,p *(y+q)。将括号去掉就为p *x+q,p *y+p *q。那么显然有p *x+q>p *y+p *q。所以我们可以得出一个结论:先切的到最后还是先切,后切的还是后切。
所以我们用三个数组,分别存:x、p*x,x-p *x。每次从三个数组中选出一个最大的切,切完后加入到p *x,x-p *x数组的队尾。
Code
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=8000005;
struct code{
ll l,t;
}d[3][maxn];
ll n,m,q,u,v,p,i,t,j,k,l,num,x,y,a[maxn],f[3],g[3],b[maxn];
double z;
int pan(ll x){
ll t=-1,i;
for (i=0;i<=2;i++){
if (f[i]>g[i]) continue;
if (t<0 || d[i][f[i]].l+(x-d[i][f[i]].t)*q>=d[t][f[t]].l+(x-d[t][f[t]].t)*q) t=i;
}
return t;
}
int main(){
freopen("earthworm.in","r",stdin);freopen("earthworm.out","w",stdout);
scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&q,&u,&v,&p);
for (i=1;i<=n;i++)
scanf("%lld",&a[i]);
sort(a+1,a+n+1);
for (i=1;i<=n;i++)
d[0][i].l=a[n-i+1],d[0][i].t=1;
f[0]=f[1]=f[2]=1;
g[0]=n;
for (i=1;i<=m;i++){
t=pan(i);
x=d[t][f[t]].l+(i-d[t][f[t]++].t)*q;
if (!(i%p)) printf("%d ",x);
d[1][++g[1]].l=x*u/v*1.0;
d[2][++g[2]].t=d[1][g[1]].t=i+1;
d[2][g[2]].l=x-d[1][g[1]].l;
}
printf("\n");
for (i=1;i<=n+m;i++){
t=pan(i);
x=d[t][f[t]].l+(m+1-d[t][f[t]++].t)*q;
if (!(i%p)) printf("%d ",x);
}
}