Processing math: 100%

المپدیا

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

ابزار کاربر

ابزار سایت


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

K-Equivalence

تابع ‎fa,b(x)‎ برابر است با عددی که اگر تمامی ارقام ‎a‎ آن را به ‎b‎ و تمام ارقام ‎b‎ آن را به ‎a‎ تبدیل کنیم برابر با ‎x‎ شود‎. ‎

به دو عدد ‎1xوy9 ‎ می‌گوییم ‎k-equivalent اگر به ازای هر ‎(iK)‎ ، fx,y(i)‎ عضو ‎K‎ باشد. می‌توانید بررسی کنید که رابطه k-equivalent‎ یک رابطه‌ی هم ارزی است‎. ‎ به شما مجموعه ‎K‎ داده شده است، شما باید تمام رده‌های k-equivalence‎ اعداد ‎1‎ تا ‎9‎ را به دست آورید. ‎

ورودی

  • در سطر اول ورودی عدد ‎1n104‎ آمده است. در ‎n‎ سطر بعدی در هر سطر یک بازه آمده است‎.
  • مجموعه ‎K‎ برابر با اجتماع بازه‌های داده شده است‎.
  • تمام اعداد ورودی در بازه ‎1‎ و ‎1018‎ قرار می‌گیرند.

خروجی

در هر سطر خروجی یک رده از اعداد k-equivalent‎ را چاپ نمایید‎. ‎

هر رده به صورت تعدادی عدد مرتب کنار هم است. سطر های خروجی باید به صورت ‎lexicographically‎ مرتب باشند‎. ‎ ‎

محدودیت‌ها

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

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

ورودي نمونه خروجي نمونه
1‎
1 566‎
‎1234‎‎
5
6‎
789‎
1‎
30 75‎
12
345
6
7‎
89

پاسخ

‎ فرض کنید مجموعه ‎K‎ از بازه های مجزای ‎[a2,b2]‎ ، ‎[a1,b1]‎ تا ‎[an,bn]‎ تشکیل شده باشد و ‎bi<ai+1‎.

فرض کنید تابع ‎g(x,y,t)‎ برابر باشد با کم‌ترین ‎p‎ که ‎p>t‎ و ‎fx,y(p)K.

می‌توان نشان داد که شرط لازم و کافی برای این که ‎x‎ وy k-equivalent باشند این است که شرایط زیر بر قرار باشد. ‎‎

  • g(x,y,0)=a1
  • g(x,y,bi)=ai+1,i<n
  • g(x,y,bn)=

‎ پس اگر ما بتوانیم تابع ‎g‎ را پیاده سازی کنیم می‌توانیم پاسخ سوال را به‌دست آوریم‎.

‎ برای این کار می‌توانیم سمت چپ‌ترین رقمی از ‎g(x,y,t)‎ که با ‎t‎ تفاوت دارد را محاسبه کنیم و آن را تصحیح کنیم و به جای ارقام سمت راست آن ‎0‎ قرار دهیم عدد ‎(q(t))‎. در صورتی که عدد به‌دست آمده عضوی از ‎K‎ باشد، عدد به‌دست آمده همان جواب است، در غیر این صورت مقدار ‎g(x,y,q(t))‎ را به عنوان جواب بر می‌گردانیم. چون در هر مرحله یکی از ارقام عدد معلوم می شود، حد اکثر پس از ‎18‎ مرحله جواب مشخص می شود‎.

‎ برای به دست آوردن ‎q(t)‎ باید به ازای تمامی ارقام ‎t (شامل صفر‌های بی‌ارزش آن) مقادیر بیش‌تر را قرار دهیم و ارقام سمت راست را برابر با ? قرار دهیم. ‎fx,y‎ عدد به‌دست آمده یک بازه را تشکیل می‌دهد، در صورتی که این بازه با ‎K‎ اشتراک داشت آن را به عنوان جواب برمی‌گردانیم، در غیر این صورت به سراغ ارقام بعدی‌می رویم‎.

حال به ازای تمام ‎a‎ و ‎b‎ های بین ‎1‎ تا ‎9‎ شرایط را چک می‌کنیم و رده‌های ‎k-equivalent‎ را به‌دست می‌آوریم‎.‎ ‎

پيچيدگي

چون هر کدام از اعداد ورودی حداکثر ‎18‎ رقم دارند، تمام اعمال گفته شده از ‎o(1)‎ می‌باشد، به غیر از چک کردن این که‌ یک بازه با ‎K‎ اشتراک دارد یا نه. اگر تمام ‎ai‎ ها و ‎bi‎ ها را به صورت مرتب داشته باشیم، با استفاده از‎binary search‎ می‌توانیم در زمان ‎o(logn)‎ چک کنیم که آیا یک بازه ‎[a,b]‎ باK‎ اشتراک دارد یا نه.


ابزار صفحه