Submission #39956

#TimeUsernameProblemLanguageResultExecution timeMemory
39956funcsrSpace Pirate (JOI14_space_pirate)C++14
0 / 100
1084 ms61784 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 1145141919 int N; long long K; int A[100000]; int F[60][100000]; long long C[100000]; int 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; } int 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], _); x = A[x]; } } int def_dst = f(0, K); rep(a, N) { int d = dist[0][a]; if (K <= d) { C[def_dst] += N; continue; } long long K2 = K-d; // a=b C[a]++; // a!=b rep(b, N) if (a != b) { if (dist[b][a] == INF) { C[f(b, K2-1)]++; } else { int len = 1+dist[b][a]; if (K2%len == 0) C[a]++; else C[f(b, (K2%len)-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...