luoguP2827 蚯蚓

用优先队列t了。

#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const double eps=1e-6;
const int maxn=1e5+10;
ll a[maxn];
int main(){
    ll n,m,q,u,v,tt,r,sum=0;
    double p;
    scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&q,&u,&v,&tt);
    r=n;
    for(int i=1;i<=n;++i){
        scanf("%lld",&a[i]);
    }
    sort(a+1,a+1+n,greater<int>());
    for(int i=1;i<=m;++i){
        if(i%tt==0){
            printf("%lld ",a[i]+sum);
        }
        int temp=(double)((a[i]+sum)*u)/v+eps,temp2=sum+a[i]-temp;
        sum+=q;
        if(temp<temp2)swap(temp,temp2);
        a[++r]=temp-q;a[++r]=temp2-q;
    }
    printf("\n");
    for(int i=m+1;i<=r;++i){
        printf("%lld ",a[i]);
    }
    return 0;
}

然后发现本身就是成单调的。。。记录三个数组就行。

然后类似归并排序输出。

#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
int n;int m;int q;int u;int v;int t;
queue <int> q1;queue <int> q2;queue <int> q3;
inline int maxnum()
{
int res=-0x3f3f3f3f;int num=0;
if(!q1.empty()&&res<q1.front())res=q1.front(),num=1;
if(!q2.empty()&&res<q2.front())res=q2.front(),num=2;
if(!q3.empty()&&res<q3.front())res=q3.front(),num=3;
if(num==1)q1.pop();
else if(num==2)q2.pop();
else if(num==3)q3.pop();
return res;
}
int a[100000];int now;int j;
int main()
{
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
for(int i=n-1;i>=0;i--)
{
q1.push(a[i]);
}
for(int i=1;i<=m;i++,j+=q)
{
int te=maxnum()+j;
if(i%t==0)printf("%d ",te);
//printf("ais%d bis%d\n",t*u/v-i*q,t-t*u/v-i*q);
int ma=max(1LL*te*u/v-j-q,te-1LL*te*u/v-j-q);q2.push(ma);//大的放q2,小的放q3
int mi=min(1LL*te*u/v-j-q,te-1LL*te*u/v-j-q);q3.push(mi);
}
printf("\n");
for(int i=1;!q1.empty()||!q2.empty()||!q3.empty();i++)
{ 
int res=maxnum();
if(i%t==0)printf("%d ",res+j);
}
return 0;
}

猜你喜欢

转载自www.cnblogs.com/Dream-Runner/p/9418785.html