به دلیل اینکه این سوالات برای المپیاد کامپیوتر طراحی شده و محدودیت تست‌ها، امکان ارسال فقط با زبان سی‌پلاس‌پلاس ممکن است.

فرار بزرگ


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

دان دریایی کاراییب در زندانی قرار دارند که به شکل جدولی n×nn \times nاست. از آنجایی که جک در جوانی المپیاد کامپیوتری بوده کامپیوتر مرکزی زندان را هک کرده و متوجه شده است که اتاق آن ها در خانه (1,1)(1, 1) جدول و در خروجی زندان در خانه (n,n)(n, n) قرار دارد.

هر کدام از خانه‌های جدول یک اتاق است که چهار در دارد که هر کدام روی یکی از ضلع های مربع هستند.

جک بعد از هک کردن کامپیوتر مرکزی متوجه شد که بعضی از خانه‌های جدول مین گذاری شده‌اند. طبعا هیچ‌کس دوست ندارد از روی مین رد بشود. حالا مسئله این است که جک می‌خواهد گروهش را به بیشترین تعداد دسته ممکن افراز کند و هر گروه از یک مسیر جدا برود. به این معنی که جک نیاز دارد بیشترین تعداد مسیر فرار ممکن را بداند به طوریکه هیچ اتاقی در دو مسیر دیده نشود (به جز اتاق شروع و پایان). و البته واضح است که این بیشترین تعداد مسیر ممکن حداکثر ۲ هست.

حالا قرار است جک به شما مختصات مین ها را یکی یکی بدهد و بعد از هر کوئری شما بیشترین تعداد مسیر ممکن را بگویید!

پیاده‌سازی🔗

جک طی تحقیقاتش فهمید که مشتلی مسئول زندان است. همه ما می‌دانیم که جک و مشتلی از زمان المپیادشان تا الان دشمنان خونین همدیگر هستند. بنابراین مشتلی برای اینکه اطمینان حاصل کند جک از زندان فرار نمی‌کند به شایان دستور داد که هرگونه ارتباط از داخل زندان به خارج را ببندد و شایان نیز چنین کرد ولی از آنجایی که قبلا از جک رشوه گرفته بود ارتباط از خارج زندان به داخل را نبست!

بنابراین جک نمی‌تواند مختصات مین‌ها را برای شما بفرستد پس از شما می‌خواهد تابعی پیاده سازی کنید که جواب مسئله را بدهد. یعنی در این سوال شما اجازه خواندن از ورودی یا نوشتن در خروجی را ندارید. شما باید توابع زیر را پیاده سازی کنید و جک از آنها استفاده می‌کند. همچنین برنامه شما نباید تابع main داشته باشد.

در صورت هرگونه تلاش برای خواندن از ورودی یا نوشتن در خروجی یا استفاده از تابع exit نمره شما صفر می‌شود.

void init(int n, int q)
C++

شما باید این تابع را پیاده‌سازی کنید. در ابتدای فرایند این تابع تنها یک بار صدا زده می‌شود و مقادیر n,qn, q را به شما می‌دهد.

  • n: اندازه طول و عرض زندان
  • q: bomb تعداد بار‌های فراخوانی تابع
int bomb(int x, int y)
C++

شما باید این تابع را پیاده‌سازی کنید. جک با صدا زدن این تابع به شما مختصات یک مین جدید را می‌دهد. خروجی این تابع باید بیشترین تعداد مسیر فرار ممکن با اطلاعات فعلی باشد.

2n30002 \leq n \leq 3000

1qmin(2×105,n22)1 \leq q \leq min(2\times10^5, n^2-2)

1x,yn1 \leq x,y \leq n

تضمین می‌شود که x,yx,y ها غیر‌تکراری هستند. همچنین خانه شروع و پایان هیچوقت مین‌گذاری نمی‌شوند.

ارزیاب نمونه🔗

دو تابع خواسته شده را در فایل TheGreatEscape.cpp پیاده‌سازی کنید. لازم نیست جواب شما تنها شامل این دو تابع باشد بلکه بسته به نیاز خود می‌توانید توابع دیگر نیز تعریف کنید. ولی برنامه شما نباید تابع main داشته باشد.

برای کامپایل کردن برنامه باید compile_cpp.sh را اجرا کنید.

حاصل کامپایل فایل اجرایی TheGreatEscape خواهد بود که همان ارزیاب نمونه است.

سپس فایل اجرایی TheGreatEscape را که توسط compile_cpp.sh تولید شده است،‌ اجرا کنید.

ارزیاب نمونه در خط اول اعداد n,qn,q را به ترتیب می‌خواند.

سپس qq خط دیگر می‌خواند که در هر کدام ابتدا عدد xx و سپس yy آمده است. هر خط نشان دهنده یک کوئری انفجار مین است.

زیرمسئله‌ها🔗

زیرمسئله نمره محدودیت
۱ ۲ n4n \le 4
۲ ۵ n10n \le 10
۳ ۱۳ n100n \le 100
۴ ۳۱ اولین کوئری x=1,y=2x=1,y=2 است
۵ ۷ ناحیه مین‌گذاری شده همبند است
۶ ۱۸ ناحیه مین‌گذاری شده حداکثر 1010 مولفه همبندی دارد.
۷ ۲۴ بدون محدودیت اضافی

مثال🔗

ورودی نمونه ۱🔗

5 7
4 1
3 2
2 3
3 3
3 4
1 4
4 5
Plain text

خروجی نمونه ۱🔗

2211100
Plain text

ورودی نمونه ۲🔗

6 6
3 1
2 3
3 3
4 3
5 3
5 2
Plain text

خروجی نمونه ۲🔗

222222
Plain text

ورودی نمونه ۳🔗

9 18
6 6
3 4
3 1
6 8
3 2
6 4
3 5
6 7
3 3
3 7
6 5
6 3
6 9
3 6
2 5
4 1
7 6
1 5
Plain text

خروجی نمونه ۳🔗

222222222222221110
Plain text
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.