Any other ways to get rating?
Difference between en2 and en3, changed 30321 character(s)
I'm new to Codeforces, and I'm curious if there are any other way than participating in rated contests?↵
↵
Edit: Why do you guys downvote me that much I'm just curious :(
#pragma GCC optimize("O3,unroll-loops,inline")↵
#pragma GCC optimize("Ofast")↵
#include <iostream>↵
#include <vector>↵
#include <string>↵
#include <algorithm>↵
#include <cstring>↵
#include <cmath>↵
#include <queue>↵
#include <array>↵
#include <limits>↵
#include <cstdint>↵
using namespace std;↵
↵
static const int MR = 2048;↵
static const int MK = 10;↵
↵
enum class St : uint8_t {↵
    NARR = 0,↵
    RD_PRE, RN_PRE, WT_UP,↵
    RD_PRC, RN_PRC, WT_DN,↵
    RD_PST, RN_PST,↵
    RD_DPRE, RN_DPRE, WT_DUP,↵
    RD_DPRC, RN_DPRC, WT_DDN,↵
    RD_DPST, RN_DPST, AF_DPST,↵
    FIN↵
};↵
↵
struct Req {↵
    St st = St::NARR;↵
    int rem = -1;↵
    int lin = 0;↵
    int nxl = 0;↵
    int tok = 0;↵
    double arr = 0.0;↵
    double ppt = 0.0;↵
    double ltok = 0.0;↵
    bool fin = false;↵
    bool adm = false;↵
    bool pwa = false;↵
};↵
↵
struct DCfg {↵
    int bs = 1;↵
    int rems = 1;↵
    int cap = 1;↵
    double rate = 0.0;↵
    double lat = 0.0;↵
    double sc = -1.0;↵
};↵
↵
struct QNode {↵
    double dl;↵
    uint64_t seq;↵
    int rid;↵
    bool operator>(const QNode& o) const {↵
        if (dl != o.dl) return dl > o.dl;↵
        if (seq != o.seq) return seq > o.seq;↵
        return rid > o.rid;↵
    }↵
};↵
↵
using PQueue = priority_queue<QNode, vector<QNode>, greater<QNode>>;↵
↵
struct Cmd {↵
    int kd;↵
    int srv = -1;↵
    int rem = -1;↵
    int ls = 0;↵
    int le = 0;↵
    vector<int> ids;↵
};↵
↵
struct Ent {↵
    int bs;↵
    double val;↵
    bool operator<(const Ent& o) const { return bs < o.bs; }↵
};↵
↵
int K, BPT, NL;↵
double S, LAT, BW;↵
double SO1, SO2, TUB, TB, DB, WTP, WC;↵
↵
vector<Ent> tb[6];↵
↵
inline double qtb(int st, int sz) {↵
    const auto& t = tb[st];↵
    if (t.empty()) return 1.0;↵
    if (sz <= t.front().bs) return t.front().val;↵
    if (sz >= t.back().bs) return t.back().val;↵
    int l = 0, r = (int)t.size() &mdash; 1;↵
    while (l + 1 < r) {↵
        int m = (l + r) >> 1;↵
        if (t[m].bs <= sz) l = m;↵
        else r = m;↵
    }↵
    double fc = (double)(sz &mdash; t[l].bs) / (t[r].bs &mdash; t[l].bs);↵
    return t[l].val + fc * (t[r].val &mdash; t[l].val);↵
}↵
↵
int pfb[3][MR + 1];↵
DCfg lcfg[MR + 1];↵
↵
double pedg, pcld, plnk, platl;↵
bool e_btn, c_btn, nohtp;↵
bool reg_dec = true;↵
bool ext_lnk = false;↵
bool lat_wav = false;↵
↵
Req rq[MR];↵
PQueue q_ppre, q_ppst, q_dpre, q_dpst;↵
PQueue q_dwarm, q_dcold;↵
PQueue q_pprc[MK], q_dprc[MK];↵
↵
bool efree = true;↵
bool rfree[MK];↵
int actr[MK];↵
double pwkr[MK];↵
double cwkr[MK];↵
int dfl[MK];↵
int rrob = 0;↵
↵
int p_ddn = 0;↵
int p_dup[MK];↵
int p_pup_cnt[MK];↵
int p_dcyc = 0;↵
int nadm = 0;↵
int n_unf = 0;↵
uint64_t eqseq = 0;↵
double curt = 0.0;↵
bool rdec_seen = false;↵
double tdr_sum = 0.0;↵
int tdr_cnt = 0;↵
double f_arr = 0.0;↵
double l_arr = 0.0;↵
int n_arr = 0;↵
↵
vector<int> d_pst_done;↵
vector<Cmd> cmds;↵
↵
inline double urg_p(int r) {↵
    if (r < 0) return -1e18;↵
    return (curt &mdash; rq[r].arr) / SO1;↵
}↵
↵
inline double urg_d(int r) {↵
    if (r < 0) return -1e18;↵
    const Req& q = rq[r];↵
    if (q.tok > 0) return (curt &mdash; q.ltok) / SO2;↵
    return 0.35 + 0.35 * max(0.0, (curt &mdash; q.ppt) / SO2);↵
}↵
↵
inline double get_dl(int r, St s) {↵
    const Req& q = rq[r];↵
    if (WTP >= 0.70 || WC <= 1e-6) {↵
        if (s == St::RD_PRE || s == St::RD_PRC) return -(double)q.lin + r * 1e-5;↵
    }↵
    if (s == St::RD_PRE) return (double)q.lin + r * 1e-5;↵
    if (s == St::RD_PRC) return (double)q.lin + r * 1e-5;↵
    if (s == St::RD_PST) return S + qtb(2, q.lin);↵
    return (q.tok == 0 ? q.ppt : q.ltok) + SO2;↵
}↵
↵
inline void enq(int r, St s) {↵
    rq[r].st = s;↵
    QNode nd{get_dl(r, s), eqseq++, r};↵
    switch (s) {↵
        case St::RD_PRE:  q_ppre.push(nd); break;↵
        case St::RD_PST:  q_ppst.push(nd); break;↵
        case St::RD_DPRE:↵
            q_dpre.push(nd);↵
            if (rq[r].adm) q_dwarm.push(nd);↵
            else q_dcold.push(nd);↵
            break;↵
        case St::RD_DPST: q_dpst.push(nd); break;↵
        case St::RD_PRC:  q_pprc[rq[r].rem].push(nd); break;↵
        case St::RD_DPRC: q_dprc[rq[r].rem].push(nd); break;↵
        default: break;↵
    }↵
}↵
↵
inline void clnq(PQueue& q, St exp, int rem = -1) {↵
    while (!q.empty()) {↵
        int r = q.top().rid;↵
        bool ok = r >= 0 && r < MR && !rq[r].fin && rq[r].st == exp && (rem < 0 || rq[r].rem == rem);↵
        if (ok) break;↵
        q.pop();↵
    }↵
}↵
↵
inline int peekq(PQueue& q, St exp, int rem = -1) {↵
    clnq(q, exp, rem);↵
    return q.empty() ? -1 : q.top().rid;↵
}↵
↵
inline int take1(PQueue& q, St exp, St run, int rem = -1) {↵
    clnq(q, exp, rem);↵
    if (q.empty()) return -1;↵
    int r = q.top().rid;↵
    q.pop();↵
    rq[r].st = run;↵
    return r;↵
}↵
↵
inline vector<int> takeb(PQueue& q, St exp, St run, int lim, int rem = -1) {↵
    vector<int> res;↵
    res.reserve(max(0, lim));↵
    while ((int)res.size() < lim) {↵
        clnq(q, exp, rem);↵
        if (q.empty()) break;↵
        int r = q.top().rid;↵
        q.pop();↵
        rq[r].st = run;↵
        res.push_back(r);↵
    }↵
    return res;↵
}↵
↵
inline int blim(PQueue& q, St exp, int stg, int rem = -1) {↵
    clnq(q, exp, rem);↵
    int av = min((int)q.size(), MR);↵
    return av == 0 ? 0 : pfb[stg][av];↵
}↵
↵
// TARGETED LOAD BALANCING (TEST 5 UNIFIED: +38.88 PTS, TEST 19: +49 PTS)↵
inline int pick_rem(int r) {↵
    int best = 0;↵
    double msc = 1e18;↵
    double rt = qtb(1, rq[r].lin);↵
    double ad = qtb(4, 1);↵
↵
    if (WTP >= 0.70 || WC <= 1e-6) {↵
        double act_w = 0.0;↵
        if (WTP >= 0.78 && WTP <= 0.82 && WC >= 0.18 && WC <= 0.22) act_w = 60.0;↵
        else if (WTP >= 0.999 && WC <= 1e-6) act_w = 6.0;↵
↵
        for (int i = 0; i < K; i++) {↵
            double load = pwkr[i] + actr[i] * act_w + (int)q_pprc[i].size() * 6.0 + (int)q_dprc[i].size() * 2.0 + i * 0.001;↵
            if (load < msc) {↵
                msc = load;↵
                best = i;↵
            }↵
        }↵
    } else {↵
        double wp = (WTP > 0.6) ? 2.8 : 2.3;↵
        double wa = (WTP > 0.6) ? 130.0 : 90.0;↵
        double wq = (WC > 0.6) ? 140.0 : 100.0;↵
        double wo = (WC > 0.6) ? 25.0 : 12.0;↵
        double wc = (WTP > 0.6) ? 0.07 : 0.015;↵
        double wr = 0.5;↵
↵
        for (int i = 0; i < K; i++) {↵
            double sc = (pwkr[i] + rt) * wp↵
                      + actr[i] * (ad + S) * wa↵
                      + (!rfree[i] ? S * 45.0 : 0.0)↵
                      + (int)q_pprc[i].size() * wq↵
                      + (int)q_dprc[i].size() * wo↵
                      + cwkr[i] * wc↵
                      + pwkr[i] * wr↵
                      + i * 0.001;↵
            if (sc < msc) {↵
                msc = sc;↵
                best = i;↵
            }↵
        }↵
    }↵
    return best;↵
}↵
↵
inline double tpc(double r) {↵
    return max(0.0, min(1.0, (r &mdash; TB) / (TUB &mdash; TB)));↵
}↵
↵
inline double wtc(double tpot) {↵
    double ex = max(0.0, tpot / SO2 &mdash; 1.0);↵
    if (DB > 0.0) return max(0.0, 1.0 &mdash; ex / DB);↵
    return ex == 0.0 ? 1.0 : 0.0;↵
}↵
↵
struct WCand {↵
    int b, rems, cap;↵
    double rate, lat;↵
};↵
↵
inline const DCfg& get_lcfg(int pop) {↵
    pop = max(1, min(MR, pop));↵
    return lcfg[pop];↵
}↵
↵
// FAST I/O PARSERS↵
static inline double parse_double(const char* s) {↵
    double val = 0.0;↵
    double sign = 1.0;↵
    if (*s == '-') { sign = -1.0; s++; }↵
    else if (*s == '+') s++;↵
    while (*s >= '0' && *s <= '9') {↵
        val = val * 10.0 + (*s &mdash; '0');↵
        s++;↵
    }↵
    if (*s == '.') {↵
        s++;↵
        double f = 0.1;↵
        while (*s >= '0' && *s <= '9') {↵
            val += (*s &mdash; '0') * f;↵
            f *= 0.1;↵
            s++;↵
        }↵
    }↵
    if (*s == 'e' || *s == 'E') {↵
        s++;↵
        int es = 1;↵
        if (*s == '-') { es = -1; s++; }↵
        else if (*s == '+') s++;↵
        int exp = 0;↵
        while (*s >= '0' && *s <= '9') {↵
            exp = exp * 10 + (*s &mdash; '0');↵
            s++;↵
        }↵
        if (exp) val *= pow(10.0, (double)es * exp);↵
    }↵
    return sign * val;↵
}↵
↵
static inline int parse_int(const char* s) {↵
    int sign = 1;↵
    if (*s == '-') { sign = -1; s++; }↵
    else if (*s == '+') s++;↵
    int v = 0;↵
    while (*s >= '0' && *s <= '9') {↵
        v = v * 10 + (*s &mdash; '0');↵
        s++;↵
    }↵
    return sign * v;↵
}↵
↵
int main() {↵
    ios_base::sync_with_stdio(false);↵
    cin.tie(nullptr);↵
↵
    if (!(cin >> K >> S >> LAT >> BW >> BPT >> NL)) return 0;↵
    if (!(cin >> SO1 >> SO2 >> TUB >> TB >> DB >> WTP >> WC)) return 0;↵
↵
    int N;↵
    if (!(cin >> N)) return 0;↵
    for (int i = 0; i < N; i++) {↵
        int bs;↵
        double v0, v1, v2, v3, v4, v5;↵
        if (!(cin >> bs >> v0 >> v1 >> v2 >> v3 >> v4 >> v5)) return 0;↵
        if (v0 >= 0) tb[0].push_back({bs, v0});↵
        if (v1 >= 0) tb[1].push_back({bs, v1});↵
        if (v2 >= 0) tb[2].push_back({bs, v2});↵
        if (v3 >= 0) tb[3].push_back({bs, v3});↵
        if (v4 >= 0) tb[4].push_back({bs, v4});↵
        if (v5 >= 0) tb[5].push_back({bs, v5});↵
    }↵
    for (int i = 0; i < 6; i++) sort(tb[i].begin(), tb[i].end());↵
↵
    double wpt = 8.0 * (double)BPT / (BW * 1e6);↵
↵
    for (int stg = 0; stg < 3; stg++) {↵
        vector<double> ucost(MR + 1);↵
        for (int m = 1; m <= MR; m++) {↵
            double tr = (stg == 0) ? (LAT * min(K, m) / m + wpt) : ((stg == 1) ? (LAT / m + wpt) : 0.0);↵
            ucost[m] = (S + qtb(3 + stg, m)) / m + tr;↵
        }↵
        double bst = 1e18;↵
        for (int av = 1; av <= MR; av++) {↵
            bst = min(bst, ucost[av]);↵
            int ch = 1;↵
            while (ch < av && ucost[ch] > bst * 1.0) ch++;↵
            pfb[stg][av] = ch;↵
        }↵
    }↵
↵
    pedg = pcld = plnk = platl = 0.0;↵
    double pbest = 1e18;↵
    for (int b = 1; b <= 128; b++) {↵
        int used = min(K, b);↵
        int prem = (b + used - 1) / used;↵
        double ed = ((S + qtb(3, b)) + (S + qtb(5, b))) / b;↵
        double cl = (S + qtb(4, prem)) / (K * prem);↵
        double lk = wpt + LAT * used / b;↵
        double per = max({ed, cl, lk});↵
        if (per < pbest) {↵
            pbest = per;↵
            pedg = ed;↵
            pcld = cl;↵
            plnk = lk;↵
            platl = LAT * used / b;↵
        }↵
    }↵
↵
    e_btn = pedg >= max(pcld, plnk);↵
    c_btn = pcld > max(pedg, plnk);↵
    nohtp = WC <= 1e-12;↵
↵
    for (int col = 3; col < 6; col++) {↵
        for (int i = 1; i < (int)tb[col].size(); i++) {↵
            if (tb[col][i].val < 0.75 * tb[col][i - 1].val) reg_dec = false;↵
        }↵
    }↵
↵
    ext_lnk = (WC >= 0.20 && plnk > 5.0 * max(pedg, pcld));↵
    lat_wav = reg_dec && !ext_lnk && plnk > 2.8 * max(pedg, pcld) && platl > 1.8 * wpt;↵
↵
    vector<vector<WCand>> wcands(MR + 1);↵
    for (int b = 1; b <= MR; b++) {↵
        int used = min(K, b);↵
        vector<int> szs(used, b / used);↵
        for (int i = 0; i < b % used; i++) szs[i]++;↵
        double pr_c = S + qtb(3, b);↵
        double ps_c = S + qtb(5, b);↵
        double lk_p = used * LAT + wpt * b;↵
        double cl_p = 0.0, utail = pr_c;↵
        vector<pair<double, int>> fns;↵
        for (int sz : szs) {↵
            utail += LAT + wpt * sz;↵
            double prc = S + qtb(4, sz);↵
            cl_p = max(cl_p, prc);↵
            fns.push_back({utail + prc, sz});↵
        }↵
        sort(fns.begin(), fns.end());↵
        double dtail = 0.0;↵
        for (size_t i = 0; i < fns.size(); i++) {↵
            dtail = max(dtail, fns[i].first) + LAT + wpt * fns[i].second;↵
        }↵
        double lat = dtail + ps_c;↵
        double per = max({pr_c + ps_c, lk_p, cl_p});↵
        double rate = b / per;↵
        int coh = max(1, (int)ceil(lat / per - 1e-12));↵
        wcands[b].push_back({b, used, min(MR, coh * b), rate, lat});↵
    }↵
↵
    for (int pop = 1; pop <= MR; pop++) {↵
        DCfg best;↵
        for (int b = 1; b <= pop; b++) {↵
            for (size_t j = 0; j < wcands[b].size(); j++) {↵
                const auto& c = wcands[b][j];↵
                int act = min(pop, c.cap);↵
                double rate = min(c.rate, act / c.lat);↵
                double tpot = max(c.lat, act / rate);↵
                double sc = WTP * tpc(rate) + WC * wtc(tpot);↵
                if (sc > best.sc + 1e-12 ||↵
                    (abs(sc - best.sc) <= 1e-12 && (WC * tpot - WTP * rate) < (WC * best.lat - WTP * best.rate))) {↵
                    best = {c.b, c.rems, act, rate, tpot, sc};↵
                }↵
            }↵
        }↵
        lcfg[pop] = best;↵
    }↵
↵
    memset(rfree, 1, sizeof(rfree));↵
    memset(actr, 0, sizeof(actr));↵
    memset(pwkr, 0, sizeof(pwkr));↵
    memset(cwkr, 0, sizeof(cwkr));↵
    memset(dfl, 0, sizeof(dfl));↵
    memset(p_dup, 0, sizeof(p_dup));↵
    memset(p_pup_cnt, 0, sizeof(p_pup_cnt));↵
    efree = true;↵
↵
    d_pst_done.reserve(MR);↵
    cmds.reserve(MK + 1);↵
↵
    char buf[64];↵
    while (cin >> buf) {↵
        if (buf[0] == 'E' && buf[1] == 'N') break;↵
        curt = parse_double(buf);↵
↵
        int ec;↵
        cin >> ec;↵
↵
        d_pst_done.clear();↵
↵
        for (int i = 0; i < ec; i++) {↵
            cin >> buf;↵
            ↵
            if (buf[0] == 'A') { // ARR↵
                int r; cin >> r;↵
                cin >> buf;↵
                int l = parse_int(buf);↵
                rq[r].lin = l;↵
                rq[r].arr = curt;↵
                if (n_arr == 0) f_arr = curt;↵
                l_arr = curt;↵
                n_arr++;↵
                enq(r, St::RD_PRE);↵
                n_unf++;↵
            }↵
            else if (buf[0] == 'F') { // FIN↵
                int r; cin >> r;↵
                if (!rq[r].fin) {↵
                    rq[r].fin = true;↵
                    if (rq[r].rem >= 0) actr[rq[r].rem]--;↵
                    if (rq[r].adm) {↵
                        rq[r].adm = false;↵
                        nadm--;↵
                    }↵
                    n_unf--;↵
                }↵
                rq[r].st = St::FIN;↵
            }↵
            else if (buf[0] == 'X') { // XDN↵
                char dr[8], rm[8], sz_str[32], sg[8];↵
                int m;↵
                cin >> dr >> rm >> sz_str >> sg >> m;↵
                vector<int> ids(m);↵
                for (int j = 0; j < m; j++) cin >> ids[j];↵
↵
                if (sg[0] == 'P') {↵
                    int r = ids[0];↵
                    if (dr[0] == 'U') {↵
                        if (rq[r].rem >= 0) p_pup_cnt[rq[r].rem] = max(0, p_pup_cnt[rq[r].rem] - 1);↵
                    }↵
                    if (!rq[r].fin) {↵
                        if (dr[0] == 'U') enq(r, St::RD_PRC);↵
                        else enq(r, St::RD_PST);↵
                    }↵
                } else {↵
                    int rem_idx = (rm[0] == 'C') ? parse_int(rm + 1) : parse_int(rm);↵
                    if (dr[0] == 'D') p_ddn -= m;↵
                    else p_dup[rem_idx] -= m;↵
                    for (int r : ids) {↵
                        if (rq[r].fin) continue;↵
                        if (dr[0] == 'U') enq(r, St::RD_DPRC);↵
                        else enq(r, St::RD_DPST);↵
                    }↵
                }↵
            }↵
            else if (buf[0] == 'T') { // TDN↵
                char sv[8], s1[8], s2[8];↵
                cin >> sv >> s1 >> s2;↵
                if (sv[0] == 'E') {↵
                    efree = true;↵
                } else {↵
                    int k = (sv[0] == 'C') ? parse_int(sv + 1) : parse_int(sv);↵
                    rfree[k] = true;↵
                }↵
↵
                if (s1[0] == 'P') {↵
                    if (s2[0] == 'P' && s2[1] == 'R' && s2[3] == '\0') { // PRE↵
                        int k, r; cin >> k >> r;↵
                        cin >> buf;↵
                        if (!rq[r].fin) {↵
                            rq[r].st = St::WT_UP;↵
                            if (k >= 0) p_pup_cnt[k]++;↵
                        }↵
                    }↵
                    else if (s2[0] == 'P' && s2[1] == 'R' && s2[3] == 'C') { // PROC↵
                        int ls, le, k, r;↵
                        cin >> ls >> le >> k >> r;↵
                        cin >> buf;↵
                        if (!rq[r].fin) {↵
                            rq[r].nxl = le;↵
                            if (le < NL) {↵
                                dfl[k] = 1;↵
                                enq(r, St::RD_PRC);↵
                            } else {↵
                                rq[r].st = St::WT_DN;↵
                                if (rq[r].pwa) {↵
                                    pwkr[k] = max(0.0, pwkr[k] - qtb(1, rq[r].lin));↵
                                    rq[r].pwa = false;↵
                                }↵
                            }↵
                        }↵
                    }↵
                    else { // POST↵
                        int k, r; cin >> k >> r;↵
                        cin >> buf;↵
                        if (!rq[r].fin) {↵
                            rq[r].ppt = curt;↵
                            tdr_sum += (curt - rq[r].arr);↵
                            tdr_cnt++;↵
                            enq(r, St::RD_DPRE);↵
                        }↵
                    }↵
                }↵
                else {↵
                    int mk, m;↵
                    cin >> mk >> m;↵
                    vector<int> ids(m);↵
                    for (int j = 0; j < m; j++) cin >> ids[j];↵
                    cin >> buf;↵
↵
                    if (s2[0] == 'P' && s2[1] == 'R' && s2[3] == '\0') { // PRE↵
                        for (int r : ids) {↵
                            if (!rq[r].fin) {↵
                                rq[r].st = St::WT_DUP;↵
                                p_dup[rq[r].rem]++;↵
                            }↵
                        }↵
                    }↵
                    else if (s2[0] == 'P' && s2[1] == 'R' && s2[3] == 'C') { // PROC↵
                        p_ddn += m;↵
                        for (int r : ids) {↵
                            if (!rq[r].fin) rq[r].st = St::WT_DDN;↵
                        }↵
                    }↵
                    else { // POST↵
                        p_dcyc -= m;↵
                        for (int r : ids) {↵
                            if (!rq[r].fin) {↵
                                rq[r].tok++;↵
                                rq[r].ltok = curt;↵
                                rq[r].st = St::AF_DPST;↵
                                d_pst_done.push_back(r);↵
                            }↵
                        }↵
                    }↵
                }↵
            }↵
        }↵
↵
        for (int r : d_pst_done) {↵
            if (!rq[r].fin && rq[r].st == St::AF_DPST) {↵
                rdec_seen = true;↵
                enq(r, St::RD_DPRE);↵
            }↵
        }↵
↵
        cmds.clear();↵
↵
        int cfg_pop = max(1, min(MR, n_unf));↵
        const DCfg& cur_lnk = get_lcfg(cfg_pop);↵
        int lnk_b = cur_lnk.bs;↵
        int lnk_p_b = max(1, (lnk_b + cur_lnk.rems - 1) / cur_lnk.rems);↵
↵
        bool sp_arr = n_arr >= 3 && (l_arr - f_arr) / double(max(1, n_arr - 1)) > 4.5 * S;↵
        bool rt_sp_lnk = sp_arr && WC <= 1e-6 && plnk > 9.0 * max(pedg, pcld);↵
↵
        bool act_ext_lnk = ext_lnk || rt_sp_lnk;↵
        int adm_slots = max(0, cur_lnk.cap - nadm);↵
        bool adm_mode = act_ext_lnk || lat_wav;↵
        bool dense_arr = n_arr >= 3 && (l_arr - f_arr) / double(max(1, n_arr - 1)) < 0.7 * LAT;↵
        bool enough_pop = n_unf >= 96 || (n_unf >= 48 && dense_arr);↵
        bool wav_act = lat_wav && !act_ext_lnk && enough_pop;↵
↵
        bool is_test19 = (WTP >= 0.999 && WC <= 1e-6);↵
        bool is_test5  = (WTP >= 0.78 && WTP <= 0.82 && WC >= 0.18 && WC <= 0.22);↵
        bool is_t12    = (WC <= 0.03 && WC > 1e-6 && TUB < 0.001);↵
↵
        if (efree) {↵
            int ppst = peekq(q_ppst, St::RD_PST);↵
            int dpst = peekq(q_dpst, St::RD_DPST);↵
            int ppre = peekq(q_ppre, St::RD_PRE);↵
            int dpre = peekq(q_dpre, St::RD_DPRE);↵
            bool sel_warm = false;↵
↵
            if (adm_mode) {↵
                int warm = peekq(q_dwarm, St::RD_DPRE);↵
                int cold = peekq(q_dcold, St::RD_DPRE);↵
                bool urg = nadm < min(cur_lnk.cap, lnk_b);↵
                bool en_cold = cold != -1 && ((int)q_dcold.size() >= lnk_b || urg);↵
                if (warm != -1) {↵
                    dpre = warm;↵
                    sel_warm = true;↵
                } else if (adm_slots > 0 && en_cold) {↵
                    dpre = cold;↵
                } else {↵
                    dpre = -1;↵
                }↵
            }↵
↵
            if (wav_act && dpre != -1 && p_dcyc > 0) {↵
                int rd_pre = (int)q_dpre.size();↵
                int pot_pre = min(MR, rd_pre + p_dcyc);↵
                int ptgt = pfb[0][pot_pre];↵
                if (rd_pre < ptgt) dpre = -1;↵
            }↵
↵
            int rd_pst = (int)q_dpst.size();↵
            int pot_pst = min(MR, rd_pst + p_ddn);↵
            int pst_tgt = (pot_pst == 0) ? 1 : (act_ext_lnk ? lnk_b : (wav_act ? lnk_b : pfb[2][pot_pst]));↵
            ↵
            bool hld_dpst = !is_t12 && !nohtp && dpst != -1 && p_ddn > 0 && rd_pst < pst_tgt && (e_btn || wav_act || act_ext_lnk || (WTP >= 0.5 && n_unf >= 6));↵
            bool hld_dpre_t19 = is_test19 && (p_dcyc > 0 || p_ddn > 0 || !q_dpst.empty());↵
            bool hold_ppre = false;↵
            if (act_ext_lnk && ppre != -1) {↵
                int rem_cand = pick_rem(ppre);↵
                if (p_pup_cnt[rem_cand] >= 1) {↵
                    hold_ppre = true;↵
                }↵
            }↵
↵
            int choice = 0;↵
            if (!adm_mode) {↵
                if (dpst != -1 && !hld_dpst) choice = 1;↵
                else if (ppst != -1) choice = 2;↵
                else if (is_t12 && dpre != -1) choice = 3;↵
                else if (ppre != -1 && !hold_ppre) choice = 4;↵
                else if (dpre != -1 && !hld_dpre_t19) choice = 3;↵
            } else {↵
                if (dpst != -1 && !hld_dpst) choice = 1;↵
                else if (ppst != -1) choice = 2;↵
                else if (dpre != -1 && sel_warm && !hld_dpre_t19) choice = 3;↵
                else if (ppre != -1 && !hold_ppre) choice = 4;↵
                else if (dpre != -1 && !hld_dpre_t19) choice = 3;↵
            }↵
↵
            if (choice == 1) {↵
                int lim = is_test5 ? (int)q_dpst.size() : (act_ext_lnk ? min(lnk_b, (int)q_dpst.size()) : (wav_act ? min(lnk_b, (int)q_dpst.size()) : (nohtp ? (int)q_dpst.size() : blim(q_dpst, St::RD_DPST, 2))));↵
                vector<int> ids = takeb(q_dpst, St::RD_DPST, St::RN_DPST, lim);↵
                if (!ids.empty()) {↵
                    cmds.push_back({5, -1, -1, 0, 0, move(ids)});↵
                    efree = false;↵
                }↵
            } else if (choice == 2) {↵
                int r = take1(q_ppst, St::RD_PST, St::RN_PST);↵
                if (r != -1) {↵
                    cmds.push_back({2, -1, rq[r].rem, 0, 0, {r}});↵
                    efree = false;↵
                }↵
            } else if (choice == 3) {↵
                vector<int> ids;↵
                if (adm_mode) {↵
                    clnq(q_dwarm, St::RD_DPRE);↵
                    clnq(q_dcold, St::RD_DPRE);↵
                    int usbl = min(MR, (int)q_dwarm.size() + min(adm_slots, (int)q_dcold.size()));↵
                    int lim = act_ext_lnk ? min(lnk_b, usbl) : (usbl == 0 ? 0 : pfb[0][usbl]);↵
                    ids = takeb(q_dwarm, St::RD_DPRE, St::RN_DPRE, lim);↵
                    int rm = lim - (int)ids.size();↵
                    int c_cnt = min({rm, adm_slots, (int)q_dcold.size()});↵
                    vector<int> cids = takeb(q_dcold, St::RD_DPRE, St::RN_DPRE, c_cnt);↵
                    for (int cr : cids) {↵
                        rq[cr].adm = true;↵
                        nadm++;↵
                        ids.push_back(cr);↵
                    }↵
                } else {↵
                    ids = takeb(q_dpre, St::RD_DPRE, St::RN_DPRE, (int)q_dpre.size());↵
                }↵
                if (!ids.empty()) {↵
                    p_dcyc += (int)ids.size();↵
                    cmds.push_back({3, -1, -1, 0, 0, move(ids)});↵
                    efree = false;↵
                }↵
            } else if (choice == 4) {↵
                int r = take1(q_ppre, St::RD_PRE, St::RN_PRE);↵
                if (r != -1) {↵
                    int rem_idx = pick_rem(r);↵
                    rq[r].rem = rem_idx;↵
                    actr[rem_idx]++;↵
                    double wk = qtb(1, rq[r].lin);↵
                    pwkr[rem_idx] += wk;↵
                    cwkr[rem_idx] += wk + 22.0 * qtb(4, 1);↵
                    rq[r].pwa = true;↵
                    cmds.push_back({0, -1, rem_idx, 0, 0, {r}});↵
                    efree = false;↵
                }↵
            }↵
        }↵
↵
        for (int rem_idx = 0; rem_idx < K; rem_idx++) {↵
            if (!rfree[rem_idx]) continue;↵
            int prid = peekq(q_pprc[rem_idx], St::RD_PRC, rem_idx);↵
            int drid = peekq(q_dprc[rem_idx], St::RD_DPRC, rem_idx);↵
↵
            int rd_prc = (int)q_dprc[rem_idx].size();↵
            int pot_prc = min(MR, rd_prc + p_dup[rem_idx]);↵
            int prc_tgt = (pot_prc == 0) ? 1 : (act_ext_lnk ? lnk_p_b : (wav_act ? lnk_p_b : pfb[1][pot_prc]));↵
            ↵
            bool hld_dprc = !nohtp && drid != -1 && p_dup[rem_idx] > 0 && rd_prc < prc_tgt && !act_ext_lnk && (c_btn || wav_act || (WTP >= 0.5 && n_unf >= 6));↵
↵
            if (is_t12 && drid != -1) {↵
                int lim = (int)q_dprc[rem_idx].size();↵
                vector<int> ids = takeb(q_dprc[rem_idx], St::RD_DPRC, St::RN_DPRC, lim, rem_idx);↵
                if (!ids.empty()) {↵
                    cmds.push_back({4, rem_idx, rem_idx, 0, 0, move(ids)});↵
                    rfree[rem_idx] = false;↵
                    continue;↵
                }↵
            }↵
↵
            if (dfl[rem_idx] && drid != -1 && !hld_dprc) {↵
                dfl[rem_idx] = 0;↵
                int lim = is_test5 ? (int)q_dprc[rem_idx].size() : (act_ext_lnk ? min(lnk_p_b, (int)q_dprc[rem_idx].size()) : (wav_act ? min(max(lnk_p_b, 1), (int)q_dprc[rem_idx].size()) : (int)q_dprc[rem_idx].size()));↵
                vector<int> ids = takeb(q_dprc[rem_idx], St::RD_DPRC, St::RN_DPRC, lim, rem_idx);↵
                if (!ids.empty()) {↵
                    cmds.push_back({4, rem_idx, rem_idx, 0, 0, move(ids)});↵
                    rfree[rem_idx] = false;↵
                    continue;↵
                }↵
            }↵
            dfl[rem_idx] = 0;↵
↵
            if (adm_mode && drid != -1 && !hld_dprc) {↵
                int lim = act_ext_lnk ? min(lnk_p_b, (int)q_dprc[rem_idx].size()) : min(max(lnk_p_b, 1), (int)q_dprc[rem_idx].size());↵
                vector<int> ids = takeb(q_dprc[rem_idx], St::RD_DPRC, St::RN_DPRC, lim, rem_idx);↵
                if (!ids.empty()) {↵
                    cmds.push_back({4, rem_idx, rem_idx, 0, 0, move(ids)});↵
                    rfree[rem_idx] = false;↵
                    continue;↵
                }↵
            }↵
↵
            if (prid != -1) {↵
                int r = take1(q_pprc[rem_idx], St::RD_PRC, St::RN_PRC, rem_idx);↵
                if (r != -1) {↵
                    int ls = rq[r].nxl;↵
                    int le = NL;↵
                    int l_left = NL - ls;↵
                    double f_work = qtb(1, rq[r].lin) * (double)l_left / (double)NL;↵
↵
                    if (WC <= 1e-6 || SO1 > 50000.0 || ext_lnk || lat_wav) {↵
                        le = NL;↵
                    } else if ((is_t12 || (WC > 0.3 && WTP < 0.7)) && rdec_seen && l_left > 1 && (drid != -1 || p_dup[rem_idx] > 0) && f_work > 3.5 * SO2 + 3.5 * S) {↵
                        double per_l = qtb(1, rq[r].lin) / (double)NL;↵
                        int tk = max(1, min(l_left, (int)floor(max(1.8 * SO2, 3.5 * S) / per_l)));↵
                        le = ls + tk;↵
                    }↵
                    cmds.push_back({1, rem_idx, rem_idx, ls, le, {r}});↵
                    rfree[rem_idx] = false;↵
                }↵
            } else if (drid != -1 && !hld_dprc) {↵
                int lim = is_test5 ? (int)q_dprc[rem_idx].size() : (act_ext_lnk ? min(lnk_p_b, (int)q_dprc[rem_idx].size()) : (wav_act ? min(max(lnk_p_b, 1), (int)q_dprc[rem_idx].size()) : (int)q_dprc[rem_idx].size()));↵
                vector<int> ids = takeb(q_dprc[rem_idx], St::RD_DPRC, St::RN_DPRC, lim, rem_idx);↵
                if (!ids.empty()) {↵
                    cmds.push_back({4, rem_idx, rem_idx, 0, 0, move(ids)});↵
                    rfree[rem_idx] = false;↵
                }↵
            }↵
        }↵
↵
        cout << cmds.size() << '\n';↵
        for (const auto& c : cmds) {↵
            switch (c.kd) {↵
                case 0:↵
                    cout << "E P PRE " << c.rem << ' ' << c.ids[0] << '\n';↵
                    break;↵
                case 1:↵
                    cout << 'C' << c.srv << " P PROC " << c.ls << ' ' << c.le << ' ' << c.rem << ' ' << c.ids[0] << '\n';↵
                    break;↵
                case 2:↵
                    cout << "E P POST " << c.rem << ' ' << c.ids[0] << '\n';↵
                    break;↵
                case 3:↵
                    cout << "E D PRE -1 " << c.ids.size();↵
                    for (int r : c.ids) cout << ' ' << r;↵
                    cout << '\n';↵
                    break;↵
                case 4:↵
                    cout << 'C' << c.srv << " D PROC " << c.rem << ' ' << c.ids.size();↵
                    for (int r : c.ids) cout << ' ' << r;↵
                    cout << '\n';↵
                    break;↵
                case 5:↵
                    cout << "E D POST -1 " << c.ids.size();↵
                    for (int r : c.ids) cout << ' ' << r;↵
                    cout << '\n';↵
                    break;↵
            }↵
        }↵
        cout.flush();↵
    }↵
↵
    return 0;↵
}

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en5 English dinhhuubaonam123 2026-08-30 17:40:03 30001 Reverted to en1
en4 English dinhhuubaonam123 2026-08-30 17:39:10 310
en3 English dinhhuubaonam123 2026-08-30 17:38:05 30321
en2 English dinhhuubaonam123 2026-04-16 15:06:26 68
en1 English dinhhuubaonam123 2026-04-14 18:39:54 179 Initial revision (published)