Submission #64949242


Source Code Expand

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

/*--------------------------------------------------------------*/
/*                     Morton‑(Z‑order) код                     */
/*--------------------------------------------------------------*/
static inline uint32_t interleaveBits(uint16_t x) {
    uint32_t v = x;
    v = (v | (v << 8)) & 0x00FF00FF;
    v = (v | (v << 4)) & 0x0F0F0F0F;
    v = (v | (v << 2)) & 0x33333333;
    v = (v | (v << 1)) & 0x55555555;
    return v;
}
static inline uint32_t morton(uint16_t x, uint16_t y) {
    return (interleaveBits(y) << 1) | interleaveBits(x);
}

/*--------------------------------------------------------------*/
/*                 Аппроксимационный Prim (O(g²))               */
/*--------------------------------------------------------------*/
vector<pair<int,int>> approximateMST(const vector<int>& v,
                                     const vector<int>& cx,
                                     const vector<int>& cy)
{
    const int g = (int)v.size();
    const long long INF = (1LL<<60);
    vector<long long> best(g, INF);
    vector<int> parent(g, -1);
    vector<char> used(g, 0);
    best[0] = 0;
    vector<pair<int,int>> edges;

    for (int step = 0; step < g; ++step) {
        int u = -1;
        long long b = INF;
        for (int i = 0; i < g; ++i)
            if (!used[i] && best[i] < b) { b = best[i]; u = i; }
        used[u] = 1;
        if (parent[u] != -1)
            edges.emplace_back(v[u], v[parent[u]]);

        for (int i = 0; i < g; ++i) if (!used[i]) {
            long long dx = cx[v[u]] - cx[v[i]];
            long long dy = cy[v[u]] - cy[v[i]];
            long long d2 = dx*dx + dy*dy;
            if (d2 < best[i]) { best[i] = d2; parent[i] = u; }
        }
    }
    return edges;            // g‑1 рёбер
}

/*--------------------------------------------------------------*/
int main () {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    /* ---------- чтение входа ---------- */
    int N,M,Q,L,W;
    if(!(cin>>N>>M>>Q>>L>>W)) return 0;

    vector<int> G(M);
    for(int &g:G) cin>>g;

    vector<int> lx(N),rx(N),ly(N),ry(N);
    for(int i=0;i<N;++i) cin>>lx[i]>>rx[i]>>ly[i]>>ry[i];

    /* ---------- оценка координат и Morton‑сортировка ---------- */
    vector<int> cx(N), cy(N);      // центры
    vector<uint32_t> code(N);      // Z‑order код
    for(int i=0;i<N;++i){
        cx[i]=(lx[i]+rx[i])>>1;
        cy[i]=(ly[i]+ry[i])>>1;
        code[i]=morton((uint16_t)cx[i],(uint16_t)cy[i]);
    }
    vector<int> order(N);
    iota(order.begin(),order.end(),0);
    sort(order.begin(),order.end(),
         [&](int a,int b){ return code[a]<code[b]; });

    /* ---------- делим города на группы ---------- */
    vector<vector<int>> groups;
    groups.reserve(M);
    int ptr=0;
    for(int g:G){
        groups.emplace_back(order.begin()+ptr, order.begin()+ptr+g);
        ptr+=g;
    }

    /* ---------- основная часть: запросы / MST ---------- */
    int queriesUsed = 0;
    vector<vector<pair<int,int>>> edges(M);

    for(int k=0;k<M;++k){
        const auto& grp = groups[k];
        int gsz = (int)grp.size();
        /* --- попробуем получить идеальные рёбра через гадалку --- */
        if(gsz>=2 && gsz<=L && queriesUsed < Q){
            ++queriesUsed;
            cout << "? " << gsz;
            for(int id:grp) cout << ' ' << id;
            cout << endl;         // обязательно \n  + flush (endl flush’ит)
            /* получаем gsz-1 строк пар (u v) */
            for(int i=0;i<gsz-1;++i){
                int a,b; cin>>a>>b;
                edges[k].emplace_back(a,b);
            }
        }else if(gsz>=2){
            /* --- fallback: приблизительный Prim по центрам --- */
            edges[k] = approximateMST(grp,cx,cy);
        }
        /* если gsz==1 — рёбра не нужны */
    }

    /* ---------- вывод окончательного решения ---------- */
    cout << "!\n";
    for(int k=0;k<M;++k){
        const auto& grp = groups[k];
        for(size_t i=0;i<grp.size();++i){
            if(i) cout << ' ';
            cout << grp[i];
        }
        cout << '\n';
        for(auto [u,v] : edges[k])
            cout << u << ' ' << v << '\n';
    }
    cout.flush();
    return 0;
}

Submission Info

Submission Time
Task A - Oracle-Guided Road Network Planning
User mHuman
Language C++ 20 (gcc 12.2)
Score 18199542
Code Size 4612 Byte
Status AC
Exec Time 32 ms
Memory 11528 KiB

Judge Result

Set Name test_ALL
Score / Max Score 18199542 / 50000000000
Status
AC × 50
Set Name Test Cases
test_ALL test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt
Case Name Status Exec Time Memory
test_0000.txt AC 32 ms 11528 KiB
test_0001.txt AC 27 ms 10968 KiB
test_0002.txt AC 26 ms 10944 KiB
test_0003.txt AC 28 ms 10976 KiB
test_0004.txt AC 28 ms 11000 KiB
test_0005.txt AC 27 ms 10984 KiB
test_0006.txt AC 27 ms 10952 KiB
test_0007.txt AC 27 ms 10960 KiB
test_0008.txt AC 26 ms 10952 KiB
test_0009.txt AC 27 ms 10904 KiB
test_0010.txt AC 28 ms 11004 KiB
test_0011.txt AC 27 ms 11000 KiB
test_0012.txt AC 27 ms 10988 KiB
test_0013.txt AC 27 ms 10900 KiB
test_0014.txt AC 27 ms 10960 KiB
test_0015.txt AC 28 ms 10976 KiB
test_0016.txt AC 27 ms 10992 KiB
test_0017.txt AC 27 ms 11004 KiB
test_0018.txt AC 27 ms 10960 KiB
test_0019.txt AC 27 ms 10968 KiB
test_0020.txt AC 28 ms 10952 KiB
test_0021.txt AC 27 ms 10964 KiB
test_0022.txt AC 27 ms 10984 KiB
test_0023.txt AC 27 ms 10908 KiB
test_0024.txt AC 27 ms 11028 KiB
test_0025.txt AC 27 ms 10992 KiB
test_0026.txt AC 28 ms 11004 KiB
test_0027.txt AC 27 ms 10976 KiB
test_0028.txt AC 27 ms 10964 KiB
test_0029.txt AC 28 ms 10916 KiB
test_0030.txt AC 28 ms 10980 KiB
test_0031.txt AC 27 ms 10916 KiB
test_0032.txt AC 28 ms 10952 KiB
test_0033.txt AC 28 ms 10964 KiB
test_0034.txt AC 27 ms 10996 KiB
test_0035.txt AC 27 ms 10960 KiB
test_0036.txt AC 27 ms 10996 KiB
test_0037.txt AC 27 ms 10912 KiB
test_0038.txt AC 27 ms 10964 KiB
test_0039.txt AC 27 ms 10908 KiB
test_0040.txt AC 28 ms 11032 KiB
test_0041.txt AC 27 ms 10908 KiB
test_0042.txt AC 27 ms 10956 KiB
test_0043.txt AC 27 ms 10992 KiB
test_0044.txt AC 27 ms 10996 KiB
test_0045.txt AC 27 ms 10912 KiB
test_0046.txt AC 27 ms 10992 KiB
test_0047.txt AC 28 ms 10920 KiB
test_0048.txt AC 27 ms 10996 KiB
test_0049.txt AC 28 ms 10984 KiB