المپدیا

دانش‌نامه‌ی المپیاد کامپیوتر ایران

ابزار کاربر

ابزار سایت


سوالات المپیاد:متفرقه:آزمون های اینترنتی ۸۹ تا ۹۱:سوال ۵۲

Function

تابع ‎$F$‎ با تابع ‎$G$‎ همگام است اگر و فقط اگر به ازای هر ‎$1 \leq x \leq n $‎ ،$F(G(x))$‎ با ‎$G(F(x))$‎ برابر باشد‎.‎

تابع ‎$F$‎ از تابع ‎$G$‎ کوچک‌تر است اگر و فقط اگر عدد ‎$1 \leq i \leq n$‎ وجود داشته باشد به طوری که: ‎

  • $F(i) < G(i)$‎
  • $F(j) = G(j)$‎ به ازای هر ‎$1 \leq j < i$‎

به شما تابع یک به یک و پوشای ‎$F$‎ از ‎$\{1,2,3,\ldots,n\} \longrightarrow \{1,2,3,\ldots,n\}$‎ داده شده است، شما باید کوچک‌ترین تابع ‎$G$‎ همگام با ‎$F$‎ به دست آورید‎.‎

ورودی

در سطر اول‌وردی عدد ‎$1 \leq n \leq 2 \times 10^5$‎ آمده است‎.‎

در سطر بعدی اعداد ‎$F(1)$‎ ، ‎$F(2)$‎ تا ‎$F(n)$‎ به ترتیب آمده‌اند.

خروجی

در تنها سطر‌‌‌‌ خروجی ‎$n$‎ عدد ‎$G(1)$‎ تا ‎$G(n)$‎ را چاپ نمایید.

محدودیت‌ها

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

ورودی و خروجی نمونه

ورودی نمونه خروجی نمونه
10
1 2 3 4 5 6 7 8 9 10
‎‎1 1 1 1 1 1 1 1 1 1‎‎
10
2 3 4 5 6 7 8 1 9 10‎
‎1 2 3 4 5 6 7 8 9 9

پاسخ

تابع ‎$F$‎ تابعی یک‌به‌یک و پوشا است. بنابراین یک جایگشت از اعداد ‎1‎ تا ‎$n$‎ است. فرض کنید که اعداد ‎$a_0$‎، ‎$a_1$‎، ‎$\cdots$‎ ، ‎$a_k-1$ شماره رئوس یکی از دورهای گراف جایگشت تابع ‎$F$‎ باشد. فرض کنید که ‎$G$‎ به شکلی تعریف شده باشد که ‎$a_0$‎ را به ‎$b_0$‎ نگاشت کند و ‎$b_0$‎ در جایگشت ‎$F$‎ در دوری به طول ‎$p$‎ قرار داشته باشد.

این دور را با اعداد ‎$b_0$‎, ‎$b_1$‎, ‎$\cdots$‎ , ‎$b_p-1$‎ نشان می‌دهیم. (ممکن است این دور همان دور ‎$a_0$‎و ‎$a_1$‎و ‎$\cdots$‎ و ‎$a_p-1$‎ باشد‎(.‎

تابع ‎$F$‎ تابعی یک‌به‌یک و پوشا است. بنابراین یک جایگشت از اعداد ‎1‎ تا ‎$n$‎ است. فرض کنید که اعداد ‎$a_0$‎و ‎$a_1$‎و ‎$\cdots$‎ و ‎$a_{k-1}$‎ شماره رئوس یکی از دورهای گراف جایگشت تابع ‎$F$‎ باشد. فرض کنید که ‎$G$‎ به شکلی تعریف شده باشد که ‎$a_0$‎ را به ‎$b_0$‎ نگاشت کند و ‎$b_0$‎ در جایگشت ‎$F$‎ در دوری به طول ‎$p$‎ قرار داشته باشد. این دور را با اعداد ‎$b_0$‎, ‎$b_1$‎و ‎$\cdots$‎ و ‎$b_{p-1}$‎ نشان می دهیم. (ممکن است این دور همان دور ‎$a_0$‎و ‎$a_1$‎و ‎$\cdots$‎ و ‎$a_{p-1}$‎ باشد‎(.‎ $$‎ f(g(a_0 ) )= g(f(a_0 ) ) \Rightarrow f(b_0 )= g(a_1 ) \Rightarrow b_1=g(a_1) $$

بنابراین تابع ‎$G$‎ باید ‎$a_1$‎ را هم به ‎$b_1$‎ نگاشت کند و همین طور می توان نشان داد که به ازای هر ‎$1 \leq i \leq k$‎، رابطه‌ی زیر برقرار است‎:‎ ‎$$ g(a_i)= b_{(i \mod p)} $$‎ بنابراین برای اینکه تابع ‎$G$‎، هر رأس از گراف جایگشت را فقط به یک رأس دیگر نگاشت می کند (خاصیت تابع)، باید ‎$k$‎ بر ‎$p$‎ بخشپذیر باشد. پس درواقع تابع ‎$G$‎ باید به این شکل باشد که رئوس هر دور از گراف جایگشت را که مثلا اندازه‌اش ‎$k$‎ می باشد به دوری دیگر از جایگشت که مثلا اندازه‌اش ‎$p$‎ است نگاشت می کند به طوری که حتما ‎$K$‎ بر ‎$p$‎ بخشپذیر است. به سادگی می توان نشان داد که این شرط کافی هم هست تا تابع ‎$G$‎ با تابع ‎$F$‎ همگام باشد‎.‎

مثلا ‎$G$‎ می تواند هر دور از گراف جایگشت ‎$F$‎ را به خودش ببرد به این شکل که تابع ‎$G$‎ تابع همانی باشد. اما ما کوچک‌ترین تابع ‎$G$‎ همگام با ‎$F$‎ را می‌خواهیم. برای مینیمم کردن تابع ‎$G$‎ باید هر دور گراف جایگشت ‎$F$‎ را مستقلا مینیمم کنیم. برای این کار کافیست به ازای هر دور در این گراف مثل ‎$C$‎ که اندازه‌اش ‎$k$‎ می‌باشد، دوری مثل ‎$C’$‎ با اندازه‌ی ‎$p$‎ پیدا کنیم که اولا ‎$k$‎ بر ‎$p$‎ بخشپذیر باشد و دوما شماره کوچک‌ترین رأس در دور ‎$C’$‎ مینیمم باشد. سپس رأس با مینیمم شماره در دور ‎$C$‎ مثل ‎$u$‎ را به رأس با مینیمم شماره در رأس ‎$C’$‎ مثل ‎$v$‎ نگاشت می‌کنیم و بقیه‌ی رئوس را به ترتیب دوری به هم نگاشت می‌کنیم.

برای یافتن دور ‎$C’$‎ و رأس ‎$u$‎ می‌توان از الگوریتمی شبیه غربال اراتستن استفاده کرد. به این طریق که به ازای هر دور در گراف که طولش ‎$k$‎ و مینیمم رأس در آن ‎$u$‎ است، در یک آرایه‌ی ‎$n$‎ تایی به اسم ‎best‎ تمام مقادیر ‎$k$‎ و ‎$2 \times k$‎ و‎$3 \times k$‎ و ‎$\cdots$‎ را با مقدار ‎$u$‎ بروزرسانی می‌کنیم. سپس برای اینکه برای دور ‎$C$‎ با طول ‎$p$‎ دور بهینه‌ی ‎$C’$‎ را بیابیم، با استفاده از مقدار ‎best[p]‎، رأس مناسب ‎$u$‎ را پیدا می کنیم‎.

پیچیدگی

یافتن دورهای گراف جایگشت ‎$F$‎ با ‎$O(n)$‎ بوسیله‌ی الگورتمی مثل ‎DFS‎ امکان‌پذیر است. سپس با روشی شبیه غربال اراتستن آرایه best‎ را مقداردهی می‌کنیم. نکته‌ی قابل توجه در این مرحله این است که برای اینکه پیچیدگی زمانی این قسمت از ‎$O(n \log n)$‎ شود، باید در ابتدا به ازای هر ‎$1 \leq i \leq n$‎، دور بهینه به طول ‎$i$‎ را پیدا کنیم و سپس از روی best[i]‎ مقادیر best[2i] و best[3i] و ‎$\cdots$‎ را بروزرسانی کنیم. بعد از بروزرسانی آرایه‌ی ‎best‎، به ازای هر دور ‎$F$‎ با ‎$O(d)$‎ که ‎$d$‎ تعداد رئوس این دور باشد، می توان مقادیر ‎$G$‎ برای رئوس این دور را به‌دست آورد که در مجموع از ‎$O(n)$‎ زمان می‌برد‎.‎ بنابراین در کل از ‎$O(n \log n)$‎ می‌توان کوچک‌ترین تابع همگام با ‎$F$‎ را پیدا کرد‎.‎


ابزار صفحه