Submission #37189

#TimeUsernameProblemLanguageResultExecution timeMemory
37189szawinisTropical Garden (IOI11_garden)C++14
100 / 100
3871 ms35920 KiB
#include "garden.h"
#include "gardenlib.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
#include <tuple>
using namespace std;
const int N = 3e5 + 1, INF = 1e9+1;

int n, p, q, res[N], d[N];
vector<int> g[N], cycle;
vector<pair<int, int>> init_g[N];

int cycle_size;
bool mark[N];
void dfs(int u) {
  mark[u] = true;
  for(int v: g[u]) {
    if(!mark[v]) {
      d[v] = d[u] + 1;
      dfs(v);
    } else if(v == p) cycle_size = d[u] + 1;
  }
}

void calc() {
  fill(mark, mark+2*n, 0);
  fill(d, d+2*n, 0);
  cycle_size = 0;
  dfs(p);
}

int solve(int len) {
  int ret = 0;
  if(cycle_size) {
    for(int i = 0; i < n; i++) if(mark[i])
      ret += d[i] <= len && (len - d[i]) % cycle_size == 0;
  } else {
    for(int i = 0; i < n; i++) if(mark[i])
      ret += d[i] == len;
  }
  return ret;
}

void count_routes(int _n, int m, int _p, int _e[][2], int _q, int len[]) {
  n = _n, p = _p, q = _q;
  for(int i = 0; i < m; i++) {
    if(init_g[_e[i][0]].size() < 2)
      init_g[_e[i][0]].emplace_back(_e[i][1], i);
    if(init_g[_e[i][1]].size() < 2)
      init_g[_e[i][1]].emplace_back(_e[i][0], i);
  }
  for(int i = 0; i < n; i++) if(init_g[i].size() == 1) init_g[i].push_back(init_g[i][0]);
  for(int u = 0; u < n; u++) {
    for(int i = 0, v, idx; i < min((int)init_g[u].size(), 2); i++) {
      tie(v, idx) = init_g[u][i];
      g[v + (idx == init_g[v][0].second) * n].push_back(u + i * n);
    }
  }
  calc();
  for(int i = 0; i < q; i++) res[i] += solve(len[i]);
  p += n;
  calc();
  for(int i = 0; i < q; i++) res[i] += solve(len[i]);
  for(int i = 0; i < q; i++) answer(res[i]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...