.لینکهای مفید برای شرکت در مسابقه:
میتوانید سوالهای خود را از بخش "سوال بپرسید" مطرح کنید. برای حل سوالات در سه سری راهنمایی به انتهای سوالات اضافه میشود. زمان اضافه شدن راهنماییها را میتوانید در قسمت آموزشی پایین سوالات ببینید.
علی برای افزایش روحیه تیم ترب تصمیم گرفته آنها را به اسکیپ روم ببرد... آنها باید سوال زیر را حل کنند تا وارد مرحله بعد شوند... به آنها کمک کنید تا این گردش برایشان جذاب شود
یک گراف ساده مانند با راس با شمارههای ۱ تا و یال دو طرفه داریم. بین هر دو راس حداکثر یک یال وجود دارد. هر یال دو راس مختلف را به هم وصل میکند. توجه کنید لزوماً این گراف همبند نیست!
هر راس از این گراف در ابتدا با یکی از دو رنگ سیاه و سفید رنگ آمیزی شده است.
در هر عملیات میتوانیم یک زیر مجموعه از رئوس مانند ، انتخاب کنیم و رنگ هر راس در مجموعه و همه رئوسی که به حداقل یک راس از یال دارند را عوض کنیم. (رنگ سفید را به سیاه و رنگ سیاه را به سفید)
میخواهیم با حداکثر عملیات کل رئوس گراف را سفید کنیم. اگر چنین کاری ممکن است یک روش برای انجام این کار ارائه دهید در غیر اینصورت بگویید این کار ممکن نیست.
در خط اول ورودی دو عدد صحیح و با فاصله از هم آمده است.
در سطر بعدی یک رشته از و به طول آمده است که اگر عدد ام آن باشد یعنی راس شماره سفید و اگر باشد یعنی رنگ راس شماره سیاه است.
در سطر بعدی هر کدوم دو عدد و آمده است. که نشان دهنده یالهای گراف است.
در صورت امکان پذیر بودن در سطر اول که تعداد مراحلی که نیاز دارید تا رنگ همه رئوس را سفید کنید چاپ کنید. در سطر بعدی در هر سطر یک رشته از و چاپ کنید که عدد ام آن است اگر راس شماره در مرحله ام در مجموعه باشد و در غیر اینصورت خواهد بود.
در صورت امکان پذیر نبودن در تنها سطر خروجی -1
را چاپ کنید.
در این قسمت راهنماییهای سوال، به مرور اضافه میشود. مشکلاتتان در راستای حل سوال را میتوانید از بخش "سوال بپرسید" مطرح کنید.
اول بیاییم یک شرط برای -1
شدن جواب پیدا کنیم.
فرض کنید دو تا راس و که به هم وصل هستند و مجموعه همسایه های یکسانی دارند، رنگشان فرق دارد. اینجوری هیچ مجموعهای که دقیقا یکی از این دو راس را شامل شود، نداریم. پس جواب برابر -1
است.
ابتدا به ازای هر و که با هم همسایهاند و مجموعه همسایههایشان برابر است، یکی را حذف کنید چون رنگ این دو همیشه برابر است و در انتها هر دو سفید میشوند. حال راسهای گراف را بر حسب درجه مرتب کنید. فرض کنید برای هر راس میتوانیم با تعدادی عملیات رنگ را عوض کنیم طوری که برای هر که رنگ ثابت بماند. حال راس هارا به ترتیب درجه از بزرگ بررسی کنید و به هرکس که رسیدید، رنگ او را با عملیات گفته شده تغییر دهید.
ادعا میکنیم عملیات گفته شده در قبل برای راس اینگونه انجام میشود: یکبار را برابر تمام ریوس غبر از قرار دهید که با مجاور نیستند. و یکبار هم را برابر با تمام ریوس قرار دهید. بدیهتا عملیات دوم رنگ تمام ریوس را تغییر میدهد پس بیایید عملیات اول را بررسی کنیم: بدیهتا هر راس غیر همسایه تغییر میکند و خود نیز تغییر نمیکند. پس فقط همسایه های میمانند. اگر راس داشتیم که رنگ تغییر میکند چون به حداقل یک راس غیر همسایه وصل است. اگر هم راس با درجه برابر داشتیم باز هم همسایه ای در دارد وگرنه مجموعه همسایه های و برابر بود.
پس با عملیات اول رنگ همه به جز و تعدادی از همسایه های با درجه کمترش عوض میشوند و پس از عملیات دوم که رنگ همه عوض میشود انگار فقط رنگ و تعدادی راس با درجه کمتر عوض شده است.
با این روش به ازای هر راس حداکثر 2 عملیات انجام داده ایم که یکی از انها روی تمام ریوس بوده است. چون از هر نوع عملیات فقط زوجیت تعداد دفعات ان مهم است پس در مجموع عملیات داریم.
زمان اجرای این راه حل از
است که با std::bitset
در زمان مطلوب اجرا میشود