Problem
Description Input Output Sample Input Sample Input1: 3 7 1 1 3 1 3 3 2 Sample Input2: 3 7 1 1 3 2 3 3 2 Sample Input3: 3 7 1 1 3 9 3 3 2 Sample Output Sample Output1: 3 4 4 4 5 5 6 6 6 6 5 5 4 4 3 2 2 Sample Output2: 4 4 5 6 5 4 3 2 Sample Output3 2 Data Constraint
Solution
我们建立三个队列,第一个队列是存原来的蚯蚓。 第二个队列我们存被切掉蚯蚓的第一部分, 第三个队列我们存被切掉蚯蚓的第二部分。 依次找出三个队列中最大的那个,将它切了。 对于q我们怎么处理呢? 我们再开一维来维护被蚯蚓刚刚被切断时的时刻,然后真实长度自己算一下就行了。
Code
using namespace std;
int i,j,k,tot,l,n,
m,
q,t,u,v,z,xb,A;
int a[N],h[N
*2],ans1[N],ans2[N],st[
3],en[
3];
struct note
{
int val,start;
};
note d1[N],d2[N],d[N];
bool cmp(note
x,note
y){
return x.val>
y.val;}
int gv(
int pos,
int now)
{
if (
pos==
0)
return d[st[
pos]].val+(now-
1-d[st[
pos]].start)
*q;
if (
pos==
1)
return d1[st[
pos]].val+(now-
1-d1[st[
pos]].start)
*q;
if (
pos==
2)
return d2[st[
pos]].val+(now-
1-d2[st[
pos]].start)
*q;
}
int gv1(
int pos)
{
if (
pos==
0)
return d[st[
pos]].val+(
m-d[st[
pos]].start)
*q;
if (
pos==
1)
return d1[st[
pos]].val+(
m-d1[st[
pos]].start)
*q;
if (
pos==
2)
return d2[st[
pos]].val+(
m-d2[st[
pos]].start)
*q;
}
int main()
{
freopen(
"earthworm.in",
"r",stdin);
freopen(
"earthworm.out",
"w",stdout);
scanf(
"%d%d%d%d%d%d",&n,&
m,&
q,&u,&v,&t);
fo(i,
1,n) scanf(
"%d",&d[i].val);
sort(d+
1,d+n+
1,cmp);
st[
0]=st[
1]=st[
2]=
1;en[
0]=n;
fo(i,
1,
m)
{
xb=
0;A=-
2147483647;
fo(j,
0,
2)
if (gv(j,i)>A && st[j]<=en[j])
{
xb=j;
A=gv(xb,i);
}
st[xb]++;
d1[++en[
1]].val=(
int)u
*1.
0/v
*A;
d2[++en[
2]].val=A-d1[en[
1]].val;
d1[en[
1]].start=d2[en[
2]].start=i;
if (i
%t==
0)
printf(
"%d ",A);
}
printf(
"\n");
fo(i,
1,n+
m)
{
xb=
0;A=-
2147483647;
fo(j,
0,
2)
if (gv1(j)>A && st[j]<=en[j])
{
xb=j;
A=gv1(xb);
}
if (i
%t==
0)
printf(
"%d ",A);
st[xb]++;
}
}
转载请注明原文地址: https://ju.6miu.com/read-968329.html