Submission #1330608

#TimeUsernameProblemLanguageResultExecution timeMemory
1330608bradley0927Post Office (JOI25_ho_t5)C++20
12 / 100
2095 ms14636 KiB
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

struct Mail {
    int dist, cur;
    bool operator<(const Mail &other) const {//largest dist at front, smallest at back
        return dist < other.dist;
    }
};

int main() {
    int n, m;
    cin >> n;
    vector<int> adj(n+1);
    for (int i = 1; i <= n; i++) cin >> adj[i];
    cin >> m;

    vector<priority_queue<Mail>> mails(n+1), new_mails(n+1);//mails at each node
    vector<int> visited(n+1, -1);

    for (int i = 0; i < m; i++) {
        int from, dest;
        cin >> from >> dest;

        int dist = 0;
        int u = from;
        while (u != dest) {
            visited[u] = i;
            dist++;
            u = adj[u];
            if (visited[u] == i) {//impossible to deliver (use t to track the time using visited array)
                cout << -1;
                return 0;
            }
        }
        if (dist != 0) mails[from].emplace(dist, from);
    }

    //delay schedule if multiple mail at same node
    int comp = 0, time = 0;//completed mails
    while (comp < m) {
        for (int i = 1; i <= n; i++) {// i = node number
            if (!mails[i].empty()) {
                Mail mail = mails[i].top();
                mails[i].pop();
                //add to next node
                mail.cur = adj[mail.cur];
                mail.dist--;
                if (mail.dist == 0) {
                    comp++;
                } else {
                    new_mails[mail.cur].push(mail);
                }
            }
        }
        for (int i = 1; i <= n; i++) {
            while (!new_mails[i].empty()) {
                Mail mail = new_mails[i].top();
                new_mails[i].pop();
                mails[i].push(mail);
            }
        }
        time++;
    }
    cout << time;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...