Submission #258682

#TimeUsernameProblemLanguageResultExecution timeMemory
258682fedoseevtimofeySpace Pirate (JOI14_space_pirate)C++14
47 / 100
1305 ms213112 KiB
#include <iostream> #include <string> #include <vector> #include <queue> #include <deque> #include <stack> #include <set> #include <map> #include <unordered_map> #include <unordered_set> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <random> #include <iomanip> #include <functional> #include <cassert> using namespace std; typedef long long ll; const int N = 3007; const int K = 60; int go[K][N]; int slow_go[N][4 * N]; ll min_dist[N][N]; int cycle_len[N]; bool used[N]; int big_step(ll x) { return 63 - __builtin_clzll(x); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); #ifdef LOCAL freopen("input.txt", "r", stdin); #endif int n; ll k; cin >> n >> k; vector <int> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; --a[i]; } for (int i = 0; i < n; ++i) { go[0][i] = a[i]; } for (int i = 1; i < K; ++i) { for (int j = 0; j < n; ++j) { go[i][j] = go[i - 1][go[i - 1][j]]; } } for (int i = 0; i < n; ++i) { int u = go[K - 1][i]; if (used[u]) continue; int len = 1; int v = a[u]; while (v != u) { v = a[v]; ++len; } used[u] = 1; cycle_len[u] = len; v = a[u]; while (v != u) { used[v] = 1; cycle_len[v] = len; v = a[v]; } } auto get = [&] (int u, ll x) { if (x <= 4 * n) return slow_go[u][x]; int p2 = big_step(x); u = go[p2][u]; x -= (1LL << p2); x %= cycle_len[u]; u = slow_go[u][x]; return u; }; for (int i = 0; i < n; ++i) { slow_go[i][0] = i; slow_go[i][1] = a[i]; for (int j = 2; j <= 4 * n; ++j) { slow_go[i][j] = a[slow_go[i][j - 1]]; } } int gogo = get(0, k); const ll Inf = 2e18; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { min_dist[i][j] = Inf; } } for (int i = 0; i < n; ++i) { for (int j = 0; j <= n; ++j) { min_dist[i][slow_go[i][j]] = min(min_dist[i][slow_go[i][j]], (ll)j); } } vector <int> cnt(n); for (int x = 0; x < n; ++x) { for (int y = 0; y < n; ++y) { ll cur_k = 0; int u = 0; if (min_dist[u][x] > (k - cur_k)) { ++cnt[gogo]; continue; } cur_k = min_dist[u][x]; u = x; if (cur_k < k && u == x) { u = y; ++cur_k; } if (min_dist[u][x] > (k - cur_k)) { ++cnt[get(u, k - cur_k)]; continue; } ll cycle_len = min_dist[u][x]; cur_k += min_dist[u][x]; u = x; if (cur_k < k && u == x) { ++cur_k; ++cycle_len; u = y; } if (cur_k < k) { ll need = (k - cur_k) % cycle_len; u = get(u, need); } ++cnt[u]; } } for (int i = 0; i < n; ++i) { cout << cnt[i] << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...