用优先队列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; }