Submission #714946

# Submission time Handle Problem Language Result Execution time Memory
714946 2023-03-25T14:40:41 Z dxz05 Swapping Cities (APIO20_swap) C++17
0 / 100
2000 ms 209732 KB
#include "swap.h"
#include <bits/stdc++.h>

using namespace std;

const int MaxN = 100005;

int N, M;
const int blockLength = 800;

struct Set{
    int parent;
    bool line;
    pair<int, int> tail;
    Set(){};
    Set(int i){
        parent = i;
        line = true;
        tail = make_pair(i, i);
    }
};

Set t[MaxN];

int MAGIC;
bool flag[MaxN];
Set mem[MaxN][MaxN / blockLength + 4];

vector<int> re; /// Todo: change to static array

int leader(int x){
    if (MAGIC != -1 && !flag[x]){
        t[x] = (MAGIC == 0 ? Set(x) : mem[x][MAGIC - 1]);
        flag[x] = true;
        re.push_back(x);
    }
    return t[x].parent == x ? x : t[x].parent = leader(t[x].parent);
}

void unite(int x, int y){
    int X = x, Y = y;
    x = leader(x);
    y = leader(y);

    if (x == y){
        t[y].line = false;
        return;
    }

    if (rand() & 1){
        swap(x, y);
        swap(X, Y);
    }

    t[x].parent = y;
    if (!t[x].line){
        t[y].line = false;
        return;
    }

    if (!t[y].line) return;

    if (t[x].tail.first != X && t[x].tail.second != X){
        t[y].line = false;
        return;
    }

    if (t[y].tail.first != Y && t[y].tail.second != Y){
        t[y].line = false;
        return;
    }

    pair<int, int> new_tail;
    new_tail.first = t[x].tail.first ^ t[x].tail.second ^ X;
    new_tail.second = t[y].tail.first ^ t[y].tail.second ^ Y;

    t[y].tail = new_tail;
}

int el[MaxN], er[MaxN];

int blockCount;

vector<tuple<int, int, int>> edges;
void init(int _N, int _M, vector<int> U, vector<int> V, vector<int> W) {
    N = _N, M = _M;

    for (int i = 0; i < M; i++){
        edges.emplace_back(W[i], U[i], V[i]);
    }

    sort(edges.begin(), edges.end());

    for (int i = 0; i < N; i++) t[i] = Set(i);

    MAGIC = -1;
    blockCount = 0;

    for (int i = 0; i < M; i++){
        unite(U[i], V[i]);

        if ((i + 1) % blockLength == 0 || i == M - 1){
            int id = blockCount++;

            el[id] = 0, er[id] = i;
            if (id > 0) el[id] = er[id - 1] + 1;

            for (int j = 0; j < N; j++) mem[j][id] = t[leader(j)];
        }

    }

    for (int i = 0; i < N; i++) flag[i] = false;
}

bool can(int x, int y){
    x = leader(x);
    y = leader(y);
    return x == y && !t[x].line;
}

int getMinimumFuelCapacity(int X, int Y) {
    int id = 0;
    while (id < blockCount){
        int xx = mem[X][id].parent, yy = mem[Y][id].parent;
        if (xx == yy && !mem[xx][id].line){
            break;
        } else {
            id++;
        }
    }

    if (id == blockCount) return -1;

    MAGIC = id;

    int ans = -1;

    re.clear();

    for (int i = el[id]; i <= er[id]; i++){
        auto [w, u, v] = edges[i];
        unite(u, v);
        if (can(X, Y)){
            ans = w;
            break;
        }
    }

    for (int i : re) flag[i] = false;

    return ans;
}
# Verdict Execution time Memory Grader output
1 Correct 96 ms 203760 KB Output is correct
2 Correct 85 ms 203736 KB Output is correct
3 Correct 85 ms 203724 KB Output is correct
4 Correct 94 ms 203744 KB Output is correct
5 Correct 91 ms 203868 KB Output is correct
6 Correct 92 ms 203800 KB Output is correct
7 Correct 97 ms 203876 KB Output is correct
8 Correct 87 ms 203852 KB Output is correct
9 Correct 294 ms 207776 KB Output is correct
10 Correct 372 ms 208196 KB Output is correct
11 Correct 363 ms 208100 KB Output is correct
12 Correct 419 ms 208300 KB Output is correct
13 Correct 406 ms 208248 KB Output is correct
14 Correct 269 ms 207840 KB Output is correct
15 Correct 549 ms 209636 KB Output is correct
16 Correct 533 ms 209484 KB Output is correct
17 Correct 539 ms 209692 KB Output is correct
18 Correct 557 ms 209732 KB Output is correct
19 Execution timed out 2095 ms 206652 KB Time limit exceeded
20 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 96 ms 203760 KB Output is correct
2 Correct 85 ms 203736 KB Output is correct
3 Execution timed out 2069 ms 209544 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 96 ms 203760 KB Output is correct
2 Correct 85 ms 203736 KB Output is correct
3 Correct 85 ms 203724 KB Output is correct
4 Correct 94 ms 203744 KB Output is correct
5 Correct 91 ms 203868 KB Output is correct
6 Correct 92 ms 203800 KB Output is correct
7 Correct 97 ms 203876 KB Output is correct
8 Correct 87 ms 203852 KB Output is correct
9 Correct 98 ms 203752 KB Output is correct
10 Incorrect 89 ms 203816 KB Output isn't correct
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 98 ms 203752 KB Output is correct
2 Correct 96 ms 203760 KB Output is correct
3 Correct 85 ms 203736 KB Output is correct
4 Correct 85 ms 203724 KB Output is correct
5 Correct 94 ms 203744 KB Output is correct
6 Correct 91 ms 203868 KB Output is correct
7 Correct 92 ms 203800 KB Output is correct
8 Correct 97 ms 203876 KB Output is correct
9 Correct 87 ms 203852 KB Output is correct
10 Correct 294 ms 207776 KB Output is correct
11 Correct 372 ms 208196 KB Output is correct
12 Correct 363 ms 208100 KB Output is correct
13 Correct 419 ms 208300 KB Output is correct
14 Correct 406 ms 208248 KB Output is correct
15 Incorrect 89 ms 203816 KB Output isn't correct
16 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 96 ms 203760 KB Output is correct
2 Correct 85 ms 203736 KB Output is correct
3 Correct 85 ms 203724 KB Output is correct
4 Correct 94 ms 203744 KB Output is correct
5 Correct 91 ms 203868 KB Output is correct
6 Correct 92 ms 203800 KB Output is correct
7 Correct 97 ms 203876 KB Output is correct
8 Correct 87 ms 203852 KB Output is correct
9 Correct 294 ms 207776 KB Output is correct
10 Correct 372 ms 208196 KB Output is correct
11 Correct 363 ms 208100 KB Output is correct
12 Correct 419 ms 208300 KB Output is correct
13 Correct 406 ms 208248 KB Output is correct
14 Correct 269 ms 207840 KB Output is correct
15 Correct 549 ms 209636 KB Output is correct
16 Correct 533 ms 209484 KB Output is correct
17 Correct 539 ms 209692 KB Output is correct
18 Correct 557 ms 209732 KB Output is correct
19 Execution timed out 2069 ms 209544 KB Time limit exceeded
20 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 98 ms 203752 KB Output is correct
2 Correct 96 ms 203760 KB Output is correct
3 Correct 85 ms 203736 KB Output is correct
4 Correct 85 ms 203724 KB Output is correct
5 Correct 94 ms 203744 KB Output is correct
6 Correct 91 ms 203868 KB Output is correct
7 Correct 92 ms 203800 KB Output is correct
8 Correct 97 ms 203876 KB Output is correct
9 Correct 87 ms 203852 KB Output is correct
10 Correct 294 ms 207776 KB Output is correct
11 Correct 372 ms 208196 KB Output is correct
12 Correct 363 ms 208100 KB Output is correct
13 Correct 419 ms 208300 KB Output is correct
14 Correct 406 ms 208248 KB Output is correct
15 Correct 269 ms 207840 KB Output is correct
16 Correct 549 ms 209636 KB Output is correct
17 Correct 533 ms 209484 KB Output is correct
18 Correct 539 ms 209692 KB Output is correct
19 Correct 557 ms 209732 KB Output is correct
20 Execution timed out 2069 ms 209544 KB Time limit exceeded
21 Halted 0 ms 0 KB -