제출 #1352081

#제출 시각아이디문제언어결과실행 시간메모리
1352081behradSpace Pirate (JOI14_space_pirate)C++20
컴파일 에러
0 ms0 KiB
#ifndef ONLINE_JUDGE
#include "/home/bgopc/template/pch.hpp"
#endif
#include <bits/stdc++.h>
using namespace std;
// * No One Dies a Virgin, Life Fucks Us All
typedef long long ll;
#define nl '\n'
#define ff first
#define ss second
#define pb push_back
#define sik(x) {cout << x << nl; return;}
constexpr ll maxn = 2e5+10, mod = 1e9 + 7, inf = 1e17, SQ = 450, LG = 20;
typedef pair<int, int> pii;

int n, a[maxn], X[maxn], h[maxn], L, _map[2 * maxn], *mp = _map + maxn, up[maxn][LG], sz[maxn];
ll K, f[maxn], ps[2 * maxn];
bool vis[maxn];
vector<int> g[maxn], path, imp[2 * maxn], i2mp[2 * maxn];

void PreDfs(int v) {
  for (int i = 1 ; i < LG ; i ++) up[v][i] = up[up[v][i - 1]][i - 1];
  vis[v] = 1;
  sz[v] = 1;
  for (int u : g[v]) {
    if (vis[u]) L = X[v];
    else {
      if (X[u] == -1) X[u] = X[v];
      h[u] = h[v] + 1;
      up[u][0] = v;
      PreDfs(u);
      sz[v] += sz[u];
    }
  }
}

int Kth(int v, int k) {
  for (int i = 0 ; i < LG ; i ++) if (k >> i & 1) v = up[v][i];
  return v;
}

void job(int v, int gL) {
  vector<int> q;
  for (;; v = a[v]) {
    if (vis[v]) break;
    q.pb(v);
    vis[v] = 1;
  }
  reverse(q.begin(), q.end());

  int L = 0;
  while (q[L] != v) ++ L;
  ++ L;

  ll cv = 0;
  vector<int> add(L);

  int KmL = K % L;

  auto upd = [&](int d) {
    int l = (d + 1 - KmL + L) % L;
    int r = l + gL;

    if (r - l > L) {
      int d = (r - l) / L;
      r -= d * L;
      cv += d;
    }

    if (r < L) ++ add[l], -- add[r];
    else ++ cv, -- add[r - L], ++ add[l];
  };

  auto dfs = [&](auto&& dfs, int v, int d) -> void {
    upd(d);
    vis[v] = 1;
    for (int u : g[v]) {
      if (!vis[u]) {
        dfs(dfs, u, d + 1);
      }
    }
  };

  for (int i = 0 ; i < q.size() ; i ++)
    dfs(dfs, q[i], i);

  for (int i = 0 ; i < L ; i ++) f[q[i]] += (cv += add[i]);
}

void dfs1(int v, int sh) {
  vis[v] = 1;
  for (int u : g[v]) {
    if (!vis[u]) {
      dfs1(u, sh);
    }
  }

  int d = h[v];
  ll l = K - d - 1 - sh, r = K - d - 1;
  ps[0] -= l / L;
  ps[0] += r / L;
  ++ ps[l % L];
  -- ps[r % L];
}

void dfs2(int v) {
  vis[v] = 1;
  for (int u : g[v]) {
    if (!vis[u]) {
      dfs2(u);
    }
  }

  int D, E;
  D = h[v] - (X[v] + 1);
  E = mp[D];
  if (E < h[v]) {
    int t = Kth(v, h[v] - E);
    if (D >= 0) f[t] += sz[v];
  } else {
    E -= D + 1;
    if (D >= 0) f[path[E]] += sz[v];
  }

  D = h[v] - L;
  E = mp[D];

  if (E < h[v]) {
    int t = Kth(v, h[v] - E);
    f[t] -= sz[v];
  } else {
    E -= D + 1;
    f[path[E]] -= sz[v];
  }

  int x = lower_bound(imp[h[v]].begin(), imp[h[v]].end(), h[v] - X[v]) - upper_bound(imp[h[v]].begin(), imp[h[v]].end(), h[v] - L);
  f[v] += 1ll * x * sz[v];
  ps[h[v]] += sz[v];
}

void dfs3(int v) {
  vis[v] = 1;
  for (int u : g[v]) {
    if (!vis[u]) {
      dfs3(u);
    }
  }

  int D, E;
  D = h[v];
  if (D > 0) {
    E = h[v] - (h[v] - mp[D] + D + 1) % (D + 1);
    f[Kth(v, h[v] - E)] += sz[v];
  }

  D = h[v] - X[v] - 1;
  if (D > 0) {
    E = (h[v] - 1) - (h[v] - 1 - mp[D] + D + 1) % (D + 1);
    f[Kth(v, h[v] - E)] -= sz[v];
  }

  int x = lower_bound(imp[h[v]].begin(), imp[h[v]].end(), h[v]) - lower_bound(imp[h[v]].begin(), imp[h[v]].end(), h[v] - X[v]);
  f[v] += 1ll * x * sz[v];
  ps[h[v]] += sz[v];
}

int32_t main() {
  cin.tie(0)->sync_with_stdio(0);

  cin >> n >> K;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
    g[a[i]].pb(i);

    X[i] = -1;
  }

  for (int v = 1 ; ; v = a[v]) {
    if (vis[v]) break;
    vis[v] = 1;
    path.pb(v);
  }

  fill(vis, vis + n + 1, 0);
  reverse(path.begin(), path.end());
  for (int i = 0 ; i < path.size() ; i ++) X[path[i]] = i;

  PreDfs(path.front());
  ++ L;

  f[path[L - (K - path.size()) % L - 1]] += 1ll * n * (n - path.size());

  for (int i = 1 ; i <= n ; i ++)
    if (!vis[i]) job(i, path.size());

  if (L < path.size()) {
    fill(vis, vis + n + 1, 0);
    for (int v : path) vis[v] = 1;

    for (int i = 0; i + 1 < path.size() ; i ++) {
      dfs1(path[i], path.size() - max(L, i + 1));
    }

    ll cv = 0;
    for (int i = 0 ; i < L ; i ++) {
      f[path[L - i - 1]] += (cv += ps[i]);
    }
    fill(ps, ps + n + 1, 0);
  }

  for (int i = -L ; i <= n ; i ++) {
    int nL = L + i + 1;
    mp[i] = nL - (K - path.size() + L) % nL - 1;
    imp[mp[i]].pb(i);
    if (mp[i] > i - 1) i2mp[mp[i] - i - 1].pb(i);
  }

  fill(vis, vis + n + 1, 0);
  for (int v : path) vis[v] = 1;

  if (L < path.size()) {
    for (int i = 0 ; i < L ; i ++) {
      sz[path[i]] -= sz[path[L]];
    }
  }

  for (int i = 0 ; i < L ; i ++) {
    dfs2(path[i]);
    for (int j : i2mp[i]) {
      if (0 <= i + j + 1 && i + 1 < L) f[path[i]] -= ps[i + j + 1];
    }
  }

  for (int i = -L ; i < 0 ; i ++) {
    f[path[mp[i] - i - 1]] += sz[path[0]];
  }

  if (L < path.size()) {
    for (int i = 0 ; i < L ; i ++) sz[path[i]] += sz[path[L]];
  }

  fill(ps, ps + n + 1, 0);
  for (int i = 0 ; i <= n ; i ++) imp[i].clear();

  for (int i = 1 ; i <= n ; i ++) {
    mp[i] = i - (K - path.size()) % (i + 1);
    for (int j = mp[i] ; j <= n ; j += i + 1) imp[j].pb(i);
  }

  fill(vis, vis + n + 1, 0);
  for (int v : path) vis[v] = 1;

  for (int i = path.size() - 1 ; i >= 0 ; i --) {
    for (int x : imp[i]) {
      if (i + x + 1 < n) f[path[i]] -= ps[i + x + 1];
    }
    dfs3(path[i]);
  }

  for (int v : path) ++ f[v];

  for (int i = 1 ; i <= n ; i ++) cout << f[i] << ' ';
  cout << nl;

  return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

space_pirate.cpp:2:10: fatal error: /home/bgopc/template/pch.hpp: No such file or directory
    2 | #include "/home/bgopc/template/pch.hpp"
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.