#include #include // Úloha 26-4-7 - Královští špioni // (v čase O(K * log K)) // Vstup: Počet špionů (N). // N čísel udávajících komu daný špion předává informace. // Pro překlad použijte normu C99 nebo novější (gcc 2647.c -o 2647 -std=c99). #define MAX_N 110000 int main() { int n; int a[MAX_N];// Vstup - komu daný špion předává informace. char p[MAX_N];// Pomocné pole pro detekci cyklů - 1 znamená, že jsme špiona navštívili. int m[MAX_N];// Výstup - počet kroků, který vykoná daná informace. // Načteme vstup. scanf("%d", &n); for (int i = 1; i<=n ; i++) { scanf("%d", a+i); } // Spočteme dobu předávání zprávy pro každého špiona. for (int i = 1; i<=n; i++) { int pozice = i; int pocet_kroku = 0; while(!p[pozice]) { // Odsimulujeme předávání zpráv a zjistíme počet kroků od i-tého špiona. p[pozice] = 1; pozice = a[pozice]; pocet_kroku++; } int c = pozice; // c označuje prvního špiona na cyklu, od něj už nechceme postupně odečítat jedničku. pocet_kroku += m[pozice]; // Přičteme počet kroků od špiona, pro kterého již výsledek známe. // Projdeme simulaci znovu a tentokrát i zapisujeme počet kroků. pozice = i; while(!m[pozice]) { m[pozice] = pocet_kroku; if (pozice == c) // V případě, že jsme již na cyklu, neodečítáme jedničku od počtu kroků. c = a[pozice]; else pocet_kroku--; pozice = a[pozice]; } } // Vytiskneme výstup. for (int i = 1; i