제출 #1342047

#제출 시각아이디문제언어결과실행 시간메모리
1342047mehrzad이주 (IOI25_migrations)C++17
0 / 100
53 ms1012 KiB
  #include "migrations.h"
  #include <bits/stdc++.h>
  using namespace std;

  // ------------------------------------------------------------
  // Global state that survives across calls of send_message.
  // It is cleared only when the first call with a new N occurs.
  // ------------------------------------------------------------
  static int N_global = 0;                     // number of sites
  static vector<vector<int>> adj;               // adjacency list of the tree
  static bool solved = false;                   // have we already computed the answer?
  static int answerU = 0, answerV = 0;          // stored answer for the second run
  static int processed = 0;                     // how many sites have been visited so far

  // ------------------------------------------------------------
  // Procedure called by the grader for each site i (1 <= i <= N-1)
  // ------------------------------------------------------------
  int send_message(int N, int i, int Pi) {
      // initialise on the very first call
      if (N_global == 0) {
          N_global = N;
          adj.assign(N_global, {});
          processed = 0;
      }

      // store the parent edge (undirected)
      adj[i].push_back(Pi);
      adj[Pi].push_back(i);
      ++processed;                     // one more site processed

      // When we have processed the very last site, the whole tree is known.
      // Compute its diameter and store the answer for the second run.
      if (processed == N_global - 1) {          // i == N-1
          // --- first BFS: farthest from node 0 -----------------
          vector<int> dist(N_global, -1);
          queue<int> q;
          q.push(0);
          dist[0] = 0;
          int A = 0;
          while (!q.empty()) {
              int v = q.front(); q.pop();
              for (int to : adj[v]) {
                  if (dist[to] == -1) {
                      dist[to] = dist[v] + 1;
                      q.push(to);
                      if (dist[to] > dist[A]) A = to;
                  }
              }
          }

          // --- second BFS: farthest from A ----------------------
          vector<int> dist2(N_global, -1);
          q = queue<int>();
          q.push(A);
          dist2[A] = 0;
          int B = A;
          while (!q.empty()) {
              int v = q.front(); q.pop();
              for (int to : adj[v]) {
                  if (dist2[to] == -1) {
                      dist2[to] = dist2[v] + 1;
                      q.push(to);
                      if (dist2[to] > dist2[B]) B = to;
                  }
              }
          }

          answerU = A;
          answerV = B;

          // Write the answer to a file that will be read in the second run.
          {
              ofstream fout("diameter.txt");
              fout << answerU << ' ' << answerV << '\n';
          }

          solved = true;                       // never recompute again
      }

      // We do not send any message (return 0). 0 ≤ 20000 and means "no message".
      return 0;
  }

  // ------------------------------------------------------------
  // Second run: the grader calls this once with the whole S array.
  // ------------------------------------------------------------
  pair<int,int> longest_path(vector<int> S) {
      (void)S;                // S is not needed – we read the answer from file.

      // Read the answer that we stored during the first run.
      ifstream fin("diameter.txt");
      if (fin) {
          fin >> answerU >> answerV;
      } else {
          // Fallback – should never happen for a correct grader.
          answerU = 0; answerV = 0;
      }

      return {answerU, answerV};
  }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...