【JZOJ4907】蚯蚓

版权声明:欢迎dalao指出错误暴踩本SD,蒟蒻写的博客转载也要吱一声 https://blog.csdn.net/enjoy_pascal/article/details/83899607

description


analysis

  • 暴力堆是部分分,但正解是乱搞

  • 可以证明或者脑补出来,先被砍半的蚯蚓的两部分一定比后砍半的蚯蚓的两部分要先砍

  • 因为先砍的蚯蚓本来就比后面的蚯蚓长,所以各砍半后也是前面的蚯蚓的两部分长

  • 所以用三个队列,第一个队列存下原来的数组降序排列

  • 每次取出三个队列的队头的最大值,砍半之后塞到第二、三个队列里就可以了


code

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 10000005
#define INF 1000000007
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)

using namespace std;

ll a[3][MAXN],top[3],len[3];
ll n,m,q,u,v,t,mx,where;

inline bool cmp(ll x,ll y)
{
	return x>y;
}
inline ll read()
{
	ll x=0,f=1;char ch=getchar();
	while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
	while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
	return x*f;
}
int main()
{
	//freopen("readin.txt","r",stdin);
    freopen("earthworm.in","r",stdin);
   	freopen("earthworm.out","w",stdout);
    n=read(),m=read(),q=read(),u=read(),v=read(),t=read();
    fo(i,1,n+m)a[0][i]=a[1][i]=a[2][i]=-INF;
    fo(i,1,n)a[0][i]=read();
    sort(a[0]+1,a[0]+n+1,cmp);
    top[0]=top[1]=top[2]=1,len[0]=n;
    fo(i,1,m)
    {
        mx=-INF;
        fo(j,0,2)if(a[j][top[j]]>mx)mx=a[j][top[j]],where=j;
        mx+=(i-1)*q,++top[where];
        if (i%t==0)printf("%lld ",mx);
        ll x=mx*u/v,y=mx-x;
        a[1][++len[1]]=x-i*q,a[2][++len[2]]=y-i*q;
    }
    printf("\n");
    fo(i,1,n+m)
    {
        mx=-0x7fffffff;
        fo(j,0,2)if(a[j][top[j]]>mx)mx=a[j][top[j]],where=j;
        mx+=m*q,++top[where];
        if (i%t==0)printf("%lld ",mx);
    }
}

猜你喜欢

转载自blog.csdn.net/enjoy_pascal/article/details/83899607