Submission #499452

#TimeUsernameProblemLanguageResultExecution timeMemory
499452600MihneaAmusement Park (JOI17_amusement_park)C++17
10 / 100
167 ms262148 KiB
#include "Joi.h"
#include <bits/stdc++.h>

using namespace std;

const int BITS = 60;


void Joi(int N, int M, int A[], int B[], long long X, int T) {
  vector<vector<int>> g(N);
  vector<int> color(N);

  for (int i = 0; i < M; i++) {
    g[A[i]].push_back(B[i]);
    g[B[i]].push_back(A[i]);
  }

  vector<int> numBits(BITS);
  for (int i = 0; i < BITS; i++) {
    if (X & (1LL << i)) {
      numBits[i] = 1;
    } else {
      numBits[i] = 0;
    }
  }

  vector<bool> seen;
  int cntSeen;

  function<void(int, int)> explore = [&] (int a, int p) {
    assert(cntSeen + 1 < BITS);
    assert(!seen[color[a]]);
    cntSeen++;
    seen[color[a]] = 1;
    for (auto &b : g[a]) {
      if (b != p && cntSeen + 1 < BITS && !seen[color[b]]) {
        explore(b, a);
      }
    }
  };

  vector<int> subSize(N);

  function<void(int, int)> dfsColor = [&] (int a, int p) {
    /// color the kids first
    subSize[a] = 1;
    for (auto &b : g[a]) {
      if (b != p) {
        dfsColor(b, a);
        subSize[a] += subSize[b];
      }
    }

    cntSeen = 0;
    seen.clear();
    for (int i = 0; i < BITS; i++) {
      seen.push_back(0);
    }
    for (auto &b : g[a]) {
      if (b != p && cntSeen + 1 < BITS && !seen[color[b]]) {
        explore(b, a);
      }
    }
    color[a] = -1;
    assert(cntSeen < BITS);
    for (int j = 0; j < BITS; j++) {
      if (!seen[j]) {
        color[a] = j;
        break;
      }
    }
    assert(color[a] != -1);
  };

  dfsColor(0, -1);

  for(int i = 0; i < N; i++){
    MessageBoard(i, numBits[color[i]]);
  }
}

#include "Ioi.h"

#include <bits/stdc++.h>

using namespace std;

const int BITS = 60;

long long Ioi(int N, int M, int A[], int B[], int P, int V, int T) {
  vector<vector<int>> g(N);
  vector<int> color(N);
  vector<int> parrent(N);

  for (int i = 0; i < M; i++) {
    g[A[i]].push_back(B[i]);
    g[B[i]].push_back(A[i]);
  }

  vector<int> numBits(BITS, -1);
  int needBits = BITS;


  vector<bool> seen;
  int cntSeen;

  function<void(int, int)> explore = [&] (int a, int p) {
    assert(cntSeen + 1 < BITS);
    assert(!seen[color[a]]);
    cntSeen++;
    seen[color[a]] = 1;
    for (auto &b : g[a]) {
      if (b != p && cntSeen + 1 < BITS && !seen[color[b]]) {
        explore(b, a);
      }
    }
  };

  vector<int> subSize(N);

  function<void(int, int)> dfsColor = [&] (int a, int p) {
    parrent[a] = p;
    /// color the kids first
    subSize[a] = 1;
    for (auto &b : g[a]) {
      if (b != p) {
        dfsColor(b, a);
        subSize[a] += subSize[b];
      }
    }

    cntSeen = 0;
    seen.clear();
    for (int i = 0; i < BITS; i++) {
      seen.push_back(0);
    }
    for (auto &b : g[a]) {
      if (b != p && cntSeen + 1 < BITS && !seen[color[b]]) {
        explore(b, a);
      }
    }
    color[a] = -1;
    assert(cntSeen < BITS);
    for (int j = 0; j < BITS; j++) {
      if (!seen[j]) {
        color[a] = j;
        break;
      }
    }
    assert(color[a] != -1);
  };

  dfsColor(0, -1);

  function<void(int, int)> run = [&] (int a, int p) {

    assert(numBits[color[a]] == -1);
    numBits[color[a]] = V;
    needBits--;

    if (needBits == 0) {
      return;
    }

    for (auto &b : g[a]) {
      if (b != p && numBits[color[b]] == -1) {
        V = Move(b);
        run(b, a);

        if (needBits == 0) {
          return;
        }
        V = Move(a);
      }
    }

  };


  run(P, -1);

  long long theNum = 0;
  for (int i = 0; i < BITS; i++) {
    if (numBits[i]) {
      theNum += (1LL << i);
    }
  }
  return theNum;
}

#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...