Submission #39958

#TimeUsernameProblemLanguageResultExecution timeMemory
39958funcsrSpace Pirate (JOI14_space_pirate)C++14
10 / 100
2000 ms96940 KiB
#include <iostream> #include <queue> #include <cassert> #include <set> #include <vector> #include <algorithm> using namespace std; typedef pair<int, int> P; #define rep(i, n) for (int i=0; i<(n); i++) #define all(x) x.begin(), x.end() #define uniq(x) x.erase(unique(all(x)), x.end()) #define index(x, y) (int)(lower_bound(all(x), y) - x.begin()) #define pb push_back #define _1 first #define _2 second #define INF (1LL<<60) int N; long long K; int A[100000]; int F[60][100000]; long long C[100000]; long long dist[3000][3000]; inline int f(int x, long long k) { for (int i=59; i>=0; i--) if ((k>>i)&1) x = F[i][x]; return x; } signed main() { cin >> N >> K; if (N > 3000) abort(); rep(i, N) cin >> A[i], A[i]--, F[0][i] = A[i]; rep(i, 59) rep(j, N) F[i+1][j] = F[i][F[i][j]]; rep(i, N) { rep(j, N) dist[i][j] = INF; int x = i; rep(_, N) { dist[i][x] = min(dist[i][x], (long long)_); x = A[x]; } } int def_dst = f(0, K); rep(a, N) { long long d = dist[0][a]; if (K <= d) { C[def_dst] += N; continue; } long long K2 = K-d; rep(b, N) { if (dist[b][a] == INF) { C[f(b, K2-1)]++; } else { int len = 1+dist[b][a]; long long s = K2%len; if (s == 0) C[a]++; else C[f(b, s-1)]++; } } } rep(i, N) cout << C[i] << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...