很有意思的一道题。对于每秒的增长,因为是个定值,所以显然可以打标记处理,记录每只蚯蚓被切断的时间,那么这只增长量就是,可以利用一个堆来维护当前的最大长度,那么可以做到,这样子已经可以通过5分了(卡常卡的好一点就85)。
这题最有意思的地方就是按题目规则切出来的蚯蚓都是有单调性的。对于当前切出来的两只蚯蚓,长的那一条一定比后面切出来的长的蚯蚓长,短的同理(因为增长量是一样的,而当前找的又是最长的那条来切),所以可以维护三个队列,一个放原来的蚯蚓,一个放切出来的长的蚯蚓,一个放切出来的短的蚯蚓,然后每次选一个最长的那个出来切。然后第二次输出的时候类似归并排序那样两个指针扫一扫,就能合并三个队列,于是复杂度是严格的。不过实际上最后一步用个堆应该也可以卡过去。但是就没意思了。

#include <bits/stdc++.h>
using namespace std;

const int N = 7100010;
int n, m, q, u, v, t;
int a[100010], b[N][2], c[N][2], d[N], f[N];
int l[3], r[3];

int 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); reverse(a + 1, a + n + 1);
    l[0] = 1; r[0] = n;
    l[1] = 1; r[1] = 0;
    l[2] = 1; r[2] = 0;
    for(int i = 0; i < m; ++i) {
        int ans = 0, nx, ny;
        if(l[0] > r[0]) {
            if(l[1] <= r[1] && b[l[1]][0] + (i - b[l[1]][1]) * q >= c[l[2]][0] + (i - c[l[2]][1]) * q) ans = b[l[1]][0] + (i - b[l[1]][1]) * q, ++l[1];
            else ans = c[l[2]][0] + (i - c[l[2]][1]) * q, ++l[2];
        } else {
            if(a[l[0]] + i * q >= b[l[1]][0] + (i - b[l[1]][1]) * q && a[l[0]] + i * q >= c[l[2]][0] + (i - c[l[2]][1]) * q) ans = a[l[0]] + i * q, ++l[0];
            else if(b[l[1]][0] + (i - b[l[1]][1]) * q >= a[l[0]] + i * q && b[l[1]][0] + (i - b[l[1]][1]) * q >= c[l[2]][0] + (i - c[l[2]][1]) * q) ans = b[l[1]][0] + (i - b[l[1]][1]) * q, ++l[1];
            else ans = c[l[2]][0] + (i - c[l[2]][1]) * q, ++l[2];
        }
        nx = 1LL * ans * u / v; ny = ans - nx;
        if(nx < ny) swap(nx, ny);
        b[++r[1]][0] = nx; b[r[1]][1] = i + 1;
        c[++r[2]][0] = ny; c[r[2]][1] = i + 1;
        if((i + 1) % t == 0) printf("%d ", ans);
    }
    puts(""); int lim = m, cnt = 0;
    while(l[0] <= r[0] || l[1] <= r[1]) {
        if(l[0] <= r[0] && a[l[0]] + q * lim >= b[l[1]][0] + q * (lim - b[l[1]][1])) d[++cnt] = a[l[0]] + q * lim, ++l[0];
        else d[++cnt] = b[l[1]][0] + q * (lim - b[l[1]][1]), ++l[1];
    }
    int tot = 0, cur = 1;
    while(cur <= cnt || l[2] <= r[2]) {
        if(d[cur] >= c[l[2]][0] + (lim - c[l[2]][1]) * q) f[++tot] = d[cur++];
        else f[++tot] = c[l[2]][0] + (lim - c[l[2]][1]) * q, ++l[2];
        if(tot % t == 0) printf("%d ", f[tot]);
    }
    puts("");
    return 0;
}