Submission #1302854

#TimeUsernameProblemLanguageResultExecution timeMemory
1302854nikoloz-chMigrations (IOI25_migrations)C++20
0 / 100
1035 ms1136 KiB
#include "migrations.h"
#include <bits/stdc++.h>
using namespace std;

static const int MAXN = 10005;
static vector<int> adj[MAXN];
static int pu = -1, pv = -1, t[4] = {0,0,0,0}, r[4] = {0,0,0,0}, s = -1, c = -1;
static bool p = false, h = false, e = true;

static vector<int> bfs_from(int src, int N) {
    vector<int> dist(N, -1);
    if(src < 0 or src >= N) return dist;
    queue<int> q;dist[src] = 0;q.push(src);
    while(!q.empty()) {
        int v = q.front(); q.pop();
        for (int to : adj[v]) {
            if (to >= 0 and to < N and dist[to] == -1) {
                dist[to] = dist[v] + 1;
                q.push(to);
            }
        }
    }
    return dist;
}

static pair<int,int> recompute_diameter(int N){
    int start = 0;
    auto d0 = bfs_from(start, N);
    bool any = false;
    for (int i = 0; i < N; ++i) if (d0[i] != -1) { any = true; break; }
    if (!any) return {0,0};
    int u = start;
    for (int i = 0; i < N; ++i) if (d0[i] > d0[u]) u = i;
    auto du = bfs_from(u, N);
    int v = u;
    for (int i = 0; i < N; ++i) if (du[i] > du[v]) v = i;
    return {u, v};
}

int send_message(int N, int i, int Pi){
    if(Pi >= 0){
        if(i >= 0 and i < N and Pi >= 0 and Pi < N){
            adj[i].push_back(Pi);adj[Pi].push_back(i);
        }
    }
    auto pr = recompute_diameter(N);
    int u = pr.first, v = pr.second;
    if(u != pu or v != pv){
        pu = u; pv = v;
        t[0] = u % 10;t[1] = (u / 10) % 10;t[2] = v % 10;t[3] = (v / 10) % 10;
        int a = 0;
        for(int i = 0; i < 4; i++){
            a += (t[i] + 3) / 4;
        }
        int nmsg = 2 * a;
        if(nmsg > 24) nmsg = 24;
        int sched = N - nmsg;
        if (sched <= i) sched = i+1;
        s = sched;p = true;h = false;
        return 0;
    }
    if(p and i < s){
        return 0;
    }
    if(p and i >= s and !h){
        for(int i = 0; i < 4; i++) r[i] = t[i];
        h = true;p = false;e = true;c = -1;
        return 0;
    }
    if(h){
        if(e){
            int pos = -1;
            for(int i = 0; i < 4; i++) if (r[i] > 0){pos = i; break;}
            if(pos == -1){
                h = false;
                return 0;
            }
            c = pos;e = false;
            return (c + 1);
        }else{
            int pos = c;
            if(pos < 0 or pos >= 4){
                e = true;
                return 0;
            }
            int step = min(4, r[pos]);
            r[pos] -= step;
            e = true;
            bool tt = false;
            for(int i = 0; i < 4; i++) if(r[i] > 0){tt = true; break;}
            if(!tt) h = false;
            return step;
        }
    }

    return 0;
}

pair<int,int> longest_path(vector<int> S){
    int n = S.size(); 
    bool tr = false, used = false;
    array<int,4> num = {0,0,0,0};
    pair<int,int> ls = {0,0};
    bool bl = true;
    int ans = -1;

    for(int i = 0; i < n; ++i){
        int x = S[i];

        if(x == 0){
            if(tr && used){
                int u = num[0] + 10 * num[1];
                int v = num[2] + 10 * num[3];
                ls = {u, v};
            }
            tr = true;
            bl = true;
            ans = -1;
            used = false;
            num = {0,0,0,0};
            continue;
        }

        if(!tr) continue;

        if(x < 1 or x > 4){
            bl = true;
            ans = -1;
            continue;
        }

        if(bl){
            ans = x - 1;
            bl = false;
        } else {
            if(ans >= 0 and ans < 4){
                num[ans] += x;
                used = true;
            }
            bl = true;
            ans = -1;
        }
    }

    if(tr && used){
        int u = num[0] + 10 * num[1];
        int v = num[2] + 10 * num[3];
        ls = {u, v};
    }

    return ls;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...