话不多说,直接看题:
下面为分析:显然,我们要先合并最小的两堆(因为他们在后边也得被计算,换句话,我们独立的看,某一堆的体力值为他自己重量*从现在到最后的次数)
因此,我们可以用两个队列来做。下面我用图来描述过程:(其实可以直接优先队列)
下面为AC代码:
接题(比较难):
这个题跟上一个有异曲同工之妙,我们可以用3个队列来维护最大长度(用优先队列会超),同时,有个十分巧妙地点,对于某个过程产生的蚯蚓,我们让他们-前面时间增加的长度,这样统一了基准,巧妙地把某个过程产生的蚯蚓化为一开始就产生的。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,q,u,v,t,a[100010],ck;
bool cmp(int a,int b){return a>b;
}
signed main(){scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}sort(a+1,a+n+1,cmp);queue<int> q1;queue<int> q2;queue<int> q3;for(int i=1;i<=n;i++){q1.push(a[i]);}for(int i=1;i<=m;i++){int max1,a1=-0x7f7f7f7f,a2=-0x7f7f7f7f,a3=-0x7f7f7f7f;if(!q1.empty()) a1=q1.front();if(!q2.empty()) a2=q2.front();if(!q3.empty()) a3=q3.front();max1=max(a1,max(a2,a3));if(max1==a1) q1.pop();else if(max1==a2) q2.pop();else q3.pop();max1+=(i-1)*q;if(i%t==0) cout<<max1<<" ";q2.push(max1*u/v-(i)*q);q3.push(max1-max1*u/v-(i)*q); }cout<<endl;while(!q1.empty()&&!q2.empty()&&!q3.empty()){int a1=q1.front(),a2=q2.front(),a3=q3.front();if(a1>=max(a2,a3)){q1.pop();ck++;if(ck%t==0) cout<<a1+q*m<<" ";continue;}if(a2>=max(a1,a3)){q2.pop();ck++;if(ck%t==0) cout<<a2+q*m<<" ";continue;}if(a3>=max(a2,a1)){q3.pop();ck++;if(ck%t==0) cout<<a3+q*m<<" ";continue;}}if(q1.empty()){while(!q2.empty()&&!q3.empty()){if(q2.front()>q3.front()){ck++;if(ck%t==0)cout<<q2.front()+q*m<<" ";q2.pop();}else{ck++;if(ck%t==0)cout<<q3.front()+q*m<<" ";q3.pop();}}while(!q2.empty()&&q3.empty()){ck++;if(ck%t==0)cout<<q2.front()+q*m<<" ";q2.pop();}while(!q3.empty()&&q2.empty()){ck++;if(ck%t==0) cout<<q3.front()+q*m<<" ";q3.pop();}return 0;}if(q2.empty()){while(!q1.empty()&&!q3.empty()){if(q1.front()>q3.front()){ck++;if(ck%t==0) cout<<q1.front()+q*m<<" ";q1.pop();}else{ck++;if(ck%t==0) cout<<q3.front()+q*m<<" ";q3.pop();}}while(!q1.empty()&&q3.empty()){ck++;if(ck%t==0) cout<<q1.front()+q*m<<" ";q1.pop();}while(!q3.empty()&&q1.empty()){ck++;if(ck%t==0) cout<<q3.front()+q*m<<" ";q3.pop();}return 0;}if(q3.empty()){while(!q2.empty()&&!q1.empty()){if(q2.front()>q1.front()){ck++;if(ck%t==0) cout<<q2.front()+q*m<<" ";q2.pop();}else{ck++;if(ck%t==0) cout<<q1.front()+q*m<<" ";q1.pop();}}while(!q2.empty()&&q1.empty()){ck++;if(ck%t==0) cout<<q2.front()+q*m<<" ";q2.pop();}while(!q1.empty()&&q2.empty()){ck++;if(ck%t==0) cout<<q1.front()+q*m<<" ";q1.pop();}}
}