2017.10.1 蚯蚓 思考记录

来源:互联网 发布:高频交易程序员 编辑:程序博客网 时间:2024/05/19 02:24

现在看来这个题真心不难、

如果能保证一个从大到小的顺序的话,对所有的数依次进行相同比例的分裂操作,左右两边一定也是单调的

由于每次要+q,等价于取出元素-q,这在式子里是不影响大小关系的

所以就sort+queue就可以了


码:

#include<iostream>#include<cstdio>#include<queue>#include<algorithm>using namespace std;#define ll long longqueue<ll>q[4];int i,j,n,m,p,t,wz,lin[8000005];ll u,v,o,tot;bool cmp(ll a,ll b){return a>b;}int main(){scanf("%d%d%d%lld%lld%d",&n,&m,&p,&u,&v,&t);for(i=1;i<=n;i++){scanf("%lld",&lin[i]);}sort(lin+1,lin+1+n,cmp);for(i=1;i<=n;i++)q[2].push(lin[i]);for(i=1;i<=m;i++){ o=-2147483647,wz=0; for(j=1;j<=3;j++) { if(q[j].empty())continue; if(q[j].front()>o) { o=q[j].front(); wz=j;} }    o+=tot;if(!(i%t)){ if(m/t*t==i)printf("%lld",o);else printf("%lld ",o); }tot+=p;q[wz].pop();q[1].push(o*u/v-tot);q[3].push(o-(o*u/v)-tot);}printf("\n");for(i=1;i<=m+n;i++){ o=-2147483647,wz=0; for(j=1;j<=3;j++) { if(q[j].empty())continue; if(q[j].front()>o) { o=q[j].front(); wz=j; } } o+=tot;if(!(i%t)){ if((m+n)/t*t==i)printf("%lld",o);else printf("%lld ",o); }q[wz].pop();}}




原创粉丝点击