Submission #1250600

#TimeUsernameProblemLanguageResultExecution timeMemory
1250600LaMatematica14Make them Meet (EGOI24_makethemmeet)C++20
100 / 100
5 ms584 KiB
#include <bits/stdc++.h>
using namespace std;

void sol_riga(int N, vector<int> &ord) {
    cout << 2*((N+1)/2) << "\n";
    for (int i = 0; i < (N+1)/2; i++) {
        vector<int> col(N);
        for (int j = 0; j < N; j+=2) {
            col[ord[j]] = ord[j];
            if (j+1 < N) col[ord[j+1]] = ord[j];
        }
        for (int j = 0; j < N; j++) cout << col[j] << " ";
        cout << "\n";
        col[ord[0]] = ord[0];
        for (int j = 1; j < N; j+=2) {
            col[ord[j]] = ord[j];
            if (j+1 < N) col[ord[j+1]] = ord[j];
        }
        for (int j = 0; j < N; j++) cout << col[j] << " ";
        cout << "\n";
    }
}

struct sol_albero {
    int N;
    vector<vector<int>> adj;
    vector<int> dist; //distanza di ogni nodo dalla radice
    vector<int> pad; //padre di ogni nodo
    
    void dfs(int att) {
        for (int pros : adj[att]){
            if (pros == pad[att]) continue;
            dist[pros] = dist[att]+1;
            pad[pros] = att;
            dfs(pros);
        }
    }
    
    void risolvi(int n, vector<vector<int>> aa, int rad, int pb, int aus) {
        N = n;
        adj.resize(N); dist.resize(N); pad.resize(N);
        fill(pad.begin(), pad.end(), -1); fill(dist.begin(), dist.end(), 0);
        for (int i = 0; i < N; i++) {
            adj[i] = aa[i];
        }
        cout << 6*N << "\n";
        dfs(rad);
        for (int k = 0; k < 2*N; k++) {
            for (int i = 0; i < N; i++) {
                if ((dist[i]%2) == 0|| i == pb) cout << i << " ";
                else cout << pad[i] << " ";
            }
            cout << "\n";
            for (int i = 0; i < N; i++) {
                if ((dist[i]%2) == 1) cout << i << " ";
                else if (i == rad) cout << aus << " ";
                else cout << pad[i] << " ";
            }
            cout << "\n";
            for (int i = 0; i < N; i++) {
                if (i == rad || i == pb) cout << rad << " ";
                else cout << i << " ";
            }
            cout << "\n";
        }
    }

};

int main() {
    //freopen("output.txt", "w", stdout);
    int N, M; cin >> N >> M;
    //cout << N << " " << M << "\n";
    vector<vector<int>> adj(N);
    vector<vector<bool>> mata(N, vector<bool> (N, 0));
    for (int i = 0; i < M; i++) {
        int a, b; cin >> a >> b;
        //cout << a << " " << b << "\n";
        adj[a].push_back(b);
        adj[b].push_back(a);
        mata[a][b] = 1; mata[b][a] = 1;
    }
    vector<int> pdr(N, -1);
    vector<bool> vis(N, 0);
    vector<int> prof(N, 0);
    vector<vector<int>> sptr(N);
    stack<int> dfs; dfs.push(0);
    while (!dfs.empty()) {
        int x = dfs.top(); dfs.pop();
        if (vis[x]) continue;
        vis[x] = 1;
        if(pdr[x] != -1) {
            prof[x] = prof[pdr[x]]+1;
            sptr[pdr[x]].push_back(x);
            sptr[x].push_back(pdr[x]);
        }
        for (int y : adj[x]) {
            if (vis[y]) continue;
            pdr[y] = x;
            dfs.push(y);
        }
    }

    fill(vis.begin(), vis.end(), 0);
    bool linea = 1; int beg;
    for (int i = 0; i < N; i++) {
        if (sptr[i].size() > 2) linea  = 0;
        if (sptr[i].size() == 1) beg = i;
    }
    if (linea) {
        vector<int> ord;
        ord.push_back(beg); vis[beg] = 1;
        do {
            if (vis[sptr[beg][0]]) beg = sptr[beg][1];
            else beg = sptr[beg][0];
            ord.push_back(beg); vis[beg] = 1;
        } while (sptr[beg].size() == 2);
        sol_riga(N, ord);
        return 0;
    }
    
    pair<int, int> gb = {0, 0};
    for (int i = 0; i < N; i++) {
        if (sptr[i].size() <= 2) continue;
        gb = max(gb, {prof[i], i});
    }
    vector<int> rs;
    bool pa = 1; int fp;
    for (int x : sptr[gb.second]) {
        if (x == pdr[gb.second]) continue;
        if (mata[x][pdr[gb.second]] || !pa) {
            rs.push_back(x);
            continue;
        }
        fp = x; pa = 0;
    }
    if (pa) {
        fp = rs[rs.size()-1];
        rs.pop_back();
    }

    //scendo sul ramo di fp per mantenerlo una linea
    vis[gb.second] = 1;
    vis[fp] = 1;
    int att = fp;
    while (sptr[att].size() == 2) {
        if (vis[sptr[att][0]]) att = sptr[att][1];
        else att = sptr[att][0];
        vis[att] = 1;
    } 

    //ricalcolo lo spanning tree
    for (int i = 0; i < N; i++) {
        if (!vis[i] || i == gb.second) sptr[i].clear();
    }
    sptr[gb.second].push_back(fp);
    if(pdr[gb.second] > -1) rs.push_back(pdr[gb.second]);
    fill(pdr.begin(), pdr.end(), -1);
    for (int i : rs) {
        if (vis[i]) continue;
        pdr[i] = gb.second;
        sptr[i].push_back(gb.second);
        sptr[gb.second].push_back(i);
        dfs.push(i);
        while (!dfs.empty()) {
            int x = dfs.top(); dfs.pop();
            if (vis[x]) continue;
            vis[x] = 1;
            if(pdr[x] != -1) {
                sptr[pdr[x]].push_back(x);
                sptr[x].push_back(pdr[x]);
            }
            for (int y : adj[x]) {
                if (vis[y]) continue;
                pdr[y] = x;
                dfs.push(y);
            }
        }
    }
    sol_albero d;
    if (sptr[fp].size() == 1) d.risolvi(N, sptr, fp, -1, gb.second);
    else if (sptr[fp][0] == gb.second) d.risolvi(N, sptr, fp, sptr[fp][1], gb.second);
    else d.risolvi(N, sptr, fp, sptr[fp][0], gb.second);   
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...