CSES - E4590 2018 6 - Results
Submission details
Task:Freshman's Database
Sender:dsedov
Submission time:2018-10-20 15:01:57 +0300
Language:C++
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.02 sdetails
#2ACCEPTED0.01 sdetails
#3ACCEPTED0.41 sdetails
#4ACCEPTED0.51 sdetails
#5ACCEPTED0.51 sdetails
#6ACCEPTED0.51 sdetails
#7ACCEPTED0.53 sdetails
#8ACCEPTED0.53 sdetails
#9ACCEPTED0.51 sdetails
#10ACCEPTED0.53 sdetails

Code

#include <stdio.h>
#include <iostream>
#include <memory.h>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;

#define sqr(a) ((a) * (a))
#define pi 3.1415926535897932384626433832795

#define TASK "f"
//#define CONTEST 1
#define MAXN 1000005
#define MAXE 2000005

int fst[MAXN], nxt[MAXE], en[MAXE];
int was[MAXN];
int cnt;
int cycles;
int n;


void AddEdge(int a, int b)
{
	nxt[cnt] = fst[a];
	fst[a] = cnt;
	en[cnt] = b;
	cnt++;	
}

void dfs(int x)
{
	was[x] = 1;

	for(int i = fst[x]; i != -1; i = nxt[i])
	{
		if(was[en[i]] == 0)
			dfs(en[i]);
		else
		{
			if(was[en[i]] == 1) cycles++;
		}
	}	

	was[x] = 2;
}

void Load()
{
	cin >> n;

	for(int i = 1; i <= n; i++)
	{
		int p;
		cin >> p;
		AddEdge(i, p);
	}
}

void Solve()
{
	for(int i = 1; i <= n; i++)
		if(was[i] != 1) dfs(i);

	cout << cycles;
}

int main()
{
#ifdef CONTEST
	freopen(TASK".in", "r", stdin);
	freopen(TASK".out", "w", stdout);
#endif
	memset(fst, -1, sizeof(fst));
	Load();
	Solve();

	return 0;
}

Test details

Test 1

Verdict: ACCEPTED

input
16
2 3 4 5 6 1 4 7 7 4 12 11 14 1...

correct output
3

user output
3

Test 2

Verdict: ACCEPTED

input
2
2 1

correct output
1

user output
1

Test 3

Verdict: ACCEPTED

input
1000000
906853 1 1 1 3 4 3 2 5 5 5 10 ...

correct output
1

user output
1

Test 4

Verdict: ACCEPTED

input
1000000
227998 891986 290950 887622 37...

correct output
6736

user output
6736

Test 5

Verdict: ACCEPTED

input
1000000
832833 455297 341097 88590 258...

correct output
16

user output
16

Test 6

Verdict: ACCEPTED

input
1000000
635299 635243 476863 88031 195...

correct output
73

user output
73

Test 7

Verdict: ACCEPTED

input
1000000
444011 366349 710148 901981 81...

correct output
244

user output
244

Test 8

Verdict: ACCEPTED

input
1000000
248398 271880 881725 521008 33...

correct output
332

user output
332

Test 9

Verdict: ACCEPTED

input
999999
938280 731633 536902 381480 65...

correct output
6771

user output
6771

Test 10

Verdict: ACCEPTED

input
999999
196127 288846 245904 406819 13...

correct output
105

user output
105