• محدودیت زمان: ۳ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

معلم حنا هدیه تولد به او یک درخت ریشه‌دار \(n\) راسی داده که ریشه آن راس شماره \(1\) است. روی راس شماره \(i\) آن عدد \(a_i\) نوشته‌ شده‌‌است. حنا بعد از یادگرفتن الگوریتم جستجوی عمق اول تکه کد زیر را نوشته است.

b := an array of length n
time := 1

procedure DFS(T, a, v):
	b[time] = a[v]
	time += 1
	label v as visited
	for u in T.neighbors(v) do:
		if not visited[u] do:
			DFS(T, a, u)
		end if
	end for
end procedure

procedure countInversions()
	DFS(T, a, 1)
	return number of inversions in the array b
	/* Number of inversions in the array b is the number of distinct pairs (i, j) such that 1 <= i < j <= n and b[i] > b[j] */
end procedure

حنا می‌خواهد تابع countInversions‍ را فراخوانی کند. او می‌داند که خروجی این تابع به ترتیب همسایه‌های هر راس در تابع DFS‍ وابسته است. به او کمک کنید، کمینه خروجی ممکن این تابع را پیدا کند.

در واقع حنا می‌خواهد طوری ترتیب همسایه‌های رئوس را انتخاب کند که تعداد نابه‌جایی‌های آرایه b کمینه بشود.

منظور از نابه‌جایی تعداد جفت‌های \(1 \le i < j \le n\) است که \(a_i > a_j\) باشد.

ورودی

در سطر اول ورودی عدد \(n\) آمده‌است.

در سطر دوم، اعداد \(a_1, a_2, ..., a_n\) به ترتیب آمده‌اند.

در سطر سوم، اعداد \(p_2, p_3, ..., p_n\)، به ترتیب آمده‌اند که \(p_i\) پدر راس شماره \(i\) درخت معلم است.

\[ 1 \leq n \leq 1 \, 000 \, 000 \] \[ 0 \leq a_i \leq 2 \] \[ 1 \leq p_i < i \]

خروجی

در سطر اول خروجی، کمینه خروجی تابع countInversions را چاپ کنید.

مثال

ورودی نمونه ۱

6
0 0 2 0 0 2
1 2 3 2 2

خروجی نمونه ۱

1

ورودی نمونه ۲

8
0 1 1 2 1 0 1 2
1 2 2 1 1 2 3

خروجی نمونه ۲

0

ورودی نمونه ۳

10
2 0 1 1 1 2 1 0 0 0
1 2 2 1 5 5 5 5 5

خروجی نمونه ۳

16
ارسال پاسخ برای این سؤال
فایلی انتخاب نشده است.