P2827 蚯蚓

P2827 蚯蚓

思路:数据范围已经不能用堆模拟了。考虑先将 \(a_i\) 从大到小排序,将 \(a_i\) 依次放入队列q1,每次将砍掉后的第一段放入q2,第二段放入q3,则q1,q2,q3都单调递减。因此每次被砍的长度为q1,q2,q3队首的最大值。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=100000000007;
const int N=100005;
int n,m,q,u,v,t,a[N],d;
queue<int>q1,q2,q3;
bool cmp(const int &a,const int &b)
{
    return a>b;
}
int max(int a,int b)
{
    return a>b?a:b;
}
signed main()
{
    scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&q,&u,&v,&t);
    for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;++i)q1.push(a[i]);
    for(int i=1;i<=m;++i)
    {
        int mx=-inf;
        if(q1.size())mx=max(mx,q1.front());
        if(q2.size())mx=max(mx,q2.front());
        if(q3.size())mx=max(mx,q3.front());
        if(q1.size()&&q1.front()==mx)q1.pop();
        else if(q2.size()&&q2.front()==mx)q2.pop();
        else if(q3.size()&&q3.front()==mx)q3.pop();
        mx+=d;
        if(i%t==0)printf("%lld ",mx);
        d+=q;
        int len=mx*u/v;
        q2.push(len-d);
        q3.push(mx-len-d);
    }
    puts("");
    for(int i=1;i<=n+m;++i)
    {
        int mx=-inf;
        if(q1.size())mx=max(mx,q1.front());
        if(q2.size())mx=max(mx,q2.front());
        if(q3.size())mx=max(mx,q3.front());
        if(q1.size()&&q1.front()==mx)q1.pop();
        else if(q2.size()&&q2.front()==mx)q2.pop();
        else if(q3.size()&&q3.front()==mx)q3.pop();
        if(i%t==0)printf("%lld ",mx+d);
    }
    puts("");
    return 0;
}
原文地址:https://www.cnblogs.com/zzctommy/p/12317198.html