大概这题难度提高+省选-。

我也做了半天。

这题如果用优先队列做的话会时间超限。

所以就要用另一种巧妙的做法。

见代码……

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 int read(){
 6     int t=1,num=0;char c=getchar();
 7     while(c>'9'||c<'0'){if(c=='-')t=-1;c=getchar();}
 8     while(c>='0'&&c<='9'){num=num*10+c-'0';c=getchar();}
 9     return num*t;
10 }
11 const int maxn=100010,maxm=7000010;
12 int n,m,q,u,v,t,ab=1,bb=1,cb=1;
13 int a[maxn],b[maxm],c[maxm];
14 bool cmp(int a,int b){return a>b;}
15 void init(){
16     n=read();m=read();q=read();
17     u=read();v=read();t=read();
18     for(int i=1;i<=n;i++)a[i]=read();
19     sort(a+1,a+n+1,cmp);
20 }
21 int main()
22 {
23     init();int best;
24     for(int i=1;i<=m;i++){
25         if(i==1)best=a[ab++];
26         else{
27             if(ab>n)a[ab]=-2147483600;
28             if(b[bb]>a[ab]){
29                 if(c[cb]>b[bb])best=c[cb++];
30                 else best=b[bb++];
31             }
32             else{
33                 if(a[ab]>c[cb])best=a[ab++];
34                 else best=c[cb++];
35             }
36         }
37         best+=(i-1)*q;
38         if(i%t==0)printf("%d ",best);
39         int num=(long long)(best)*u/v;
40         b[i]=num-i*q;c[i]=best-num-i*q;
41     }puts("");
42     for(int i=1;i<=n;i++)a[i]+=m*q;
43     for(int i=1;i<=m;i++)b[i]+=m*q,c[i]+=m*q;
44     for(int i=1;i<=n+m;i++){
45         if(b[bb]>a[ab]){
46             if(c[cb]>b[bb])best=c[cb++];
47             else best=b[bb++];
48         }
49         else{
50             if(a[ab]>c[cb])best=a[ab++];
51             else best=c[cb++];
52         }
53         if(i%t==0)printf("%d ",best);
54     }
55     return 0;
56 }

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

posted on 2017-05-09 19:40  Yzyet  阅读(216)  评论(0编辑  收藏  举报