Submission #740998

#TimeUsernameProblemLanguageResultExecution timeMemory
740998LittleCube게임 (APIO22_game)C++17
60 / 100
4046 ms39688 KiB
#pragma GCC optimize("Ofast,unroll-loops")
#include "game.h"
#ifndef EVAL
#include "game_grader.cpp"
#endif
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
using namespace std;

namespace
{
  int n, k, from[300000], to[300000];
  vector<int> Ef[300000], Et[300000];
  void update_from(int u)
  {
    for (auto v : Ef[u])
      if (from[u] > from[v])
      {
        from[v] = from[u];
        update_from(v);
      }
  }
  void update_to(int u)
  {
    for (auto v : Et[u])
      if (to[u] < to[v])
      {
        to[v] = to[u];
        update_to(v);
      }
  }
}

void init(int n, int k)
{
  ::n = n, ::k = k;
  for (int i = 0; i < k; i++)
    from[i] = i, to[i] = i;
  for (int i = k; i < n; i++)
    from[i] = -1, to[i] = k + 1;
}

int add_teleporter(int u, int v)
{
  if (u < k && v < k)
  {
    if (v <= u)
      return 1;
    return 0;
  }
  Ef[u].emplace_back(v);
  Et[v].emplace_back(u);
  from[v] = max(from[v], from[u]);
  to[u] = min(to[u], to[v]);
  bool flag = 0;
  if (v >= k)
  {
    update_from(v);
    flag |= (from[v] >= to[v]);
  }
  if (u >= k)
  {
    update_to(u);
    flag |= (from[u] >= to[u]);
  }
  return flag;
}
#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...