题链
最长的蚯蚓被砍两截之后,其余的蚯蚓长度会增加,与其加其余蚯蚓不如对这两只蚯蚓操作,可定义一个$buff$表示其余蚯蚓需要增加多少长度,当拿出最长的那只蚯蚓时,就需要加上$buff$,当然被剪断的变成两条就需要减去当前$buff$再压入队列,保证下次拿出来时加上$buff$是应有的长度;
一个队列存原数组,另外两个队列分别存砍断的蚯蚓的两部分,可知这两个队列是递减的,所以普通队列就行;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include <bits/stdc++.h> using namespace std;
#define Combine Pair, greater<Pair>, pairing_heap_tag #define LL long long #define ll long long #define Pair pair<double,LL> #define ULL unsigned long long #define ls rt<<1 #define rs rt<<1|1 #define one first #define two second #define MS 7000009 #define INF 1e9 #define DBINF 1e100 #define Pi acos(-1.0) #define eps 1e-9 #define mod 1000000007 #define mod1 39989 #define mod2 1000000000
LL n,m; LL ac[MS]; LL p[MS]; priority_queue<LL,vector<LL>,less<LL> > QQ; queue<LL> Q[3]; stack<LL > sta;
int which(){ if(Q[1].empty() && Q[2].empty()) return 0; if(!Q[0].empty() && Q[0].front() >= max(Q[2].front(),Q[1].front())) return 0; else if(Q[1].front() >= Q[2].front()) return 1; return 2; }
int main() { ios::sync_with_stdio(false); LL num,u,v,t; cin >> n >> m >> num >> u >> v >> t; for(int i=1;i<=n;i++){ cin >> p[i]; } sort(p+1,p+n+1); for(int i=n;i>=1;i--){ Q[0].push(p[i]); } LL buff = 0; for(int i=1;i<=m;i++){ int wh = which(); ac[i] = Q[wh].front()+buff; LL t1 = ac[i]*u/v; LL t2 = ac[i]-t1; Q[wh].pop(); buff += num; Q[1].push(t2-buff); Q[2].push(t1-buff); } for(int i=1;i<=m;i++){ if(i%t == 0) cout << ac[i] << " "; } cout << endl; for(int i=0;i<=2;i++) while(!Q[i].empty()){ QQ.push(Q[i].front()); Q[i].pop(); } for(int i=1;!QQ.empty();i++){ if(i%t == 0) cout << QQ.top()+buff << " "; QQ.pop(); } cout << endl; return 0; }
|