Submission #1159324

#TimeUsernameProblemLanguageResultExecution timeMemory
1159324KalashnikovThe Potion of Great Power (CEOI20_potion)C++20
17 / 100
3100 ms38872 KiB
#include <bits/stdc++.h>
using namespace std;

const int INF = 1e9;
int N, D, U;
vector<int> H;
vector<pair<int, int>> trust_changes;
unordered_map<int, unordered_set<int>> trust_graph;
vector<pair<int, pair<int, int>>> trust_log; // {day, {a, b}}

void init(int N_, int D_, int H_[]) {
    N = N_; D = D_;
    H.assign(H_, H_ + N);
}

void curseChanges(int U_, int A[], int B[]) {
    U = U_;
    for (int i = 0; i < U; i++) {
        int a = A[i], b = B[i];
        trust_changes.push_back({a, b});
        trust_log.push_back({i + 1, {a, b}}); // Запоминаем день изменения
    }
}

void rebuildTrustGraph(int day) {
    trust_graph.clear();
    for (int i = 0; i < day; i++) {
        int a = trust_changes[i].first, b = trust_changes[i].second;
        if (trust_graph[a].count(b)) {
            trust_graph[a].erase(b);
            trust_graph[b].erase(a);
        } else {
            trust_graph[a].insert(b);
            trust_graph[b].insert(a);
        }
    }
}

int question(int X, int Y, int V) {
    rebuildTrustGraph(V); // Восстанавливаем граф на день V

    if (trust_graph[X].empty() || trust_graph[Y].empty()) return INF;

    int min_dist = INF;
    for (int x_prime : trust_graph[X]) {
        for (int y_prime : trust_graph[Y]) {
            if (x_prime == y_prime) return 0;
            min_dist = min(min_dist, abs(H[x_prime] - H[y_prime]));
        }
    }
    return min_dist;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...