.لینک‌های مفید برای شرکت در مسابقه:

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

گراف سفید و سیاه


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

علی برای افزایش روحیه تیم ترب تصمیم گرفته آن‌ها را به اسکیپ روم ببرد... آن‌ها باید سوال زیر را حل کنند تا وارد مرحله بعد شوند... به آن‌ها کمک کنید تا این گردش برایشان جذاب شود

یک گراف ساده مانند GG با nn راس با شماره‌های ۱ تا nn و mm یال دو طرفه داریم. بین هر دو راس حداکثر یک یال وجود دارد. هر یال دو راس مختلف را به هم وصل می‌کند. توجه کنید لزوماً این گراف همبند نیست!

هر راس از این گراف در ابتدا با یکی از دو رنگ سیاه و سفید رنگ آمیزی شده است.

در هر عملیات می‌توانیم یک زیر مجموعه از رئوس مانند SS، انتخاب کنیم و رنگ هر راس در مجموعه SS و همه رئوسی که به حداقل یک راس از SS یال دارند را عوض کنیم. (رنگ سفید را به سیاه و رنگ سیاه را به سفید)

می‌خواهیم با حداکثر n+1n + 1 عملیات کل رئوس گراف را سفید کنیم. اگر چنین کاری ممکن است یک روش برای انجام این کار ارائه دهید در غیر اینصورت بگویید این کار ممکن نیست.

ورودی🔗

در خط اول ورودی دو عدد صحیح nn و mm با فاصله از هم آمده است. 0n15000 \le n \le 15000mn(n1)2 0 \le m \le \frac{n(n - 1)}{2}

در سطر بعدی یک رشته از 00 و 11 به طول nn آمده است که اگر عدد iiام آن 00 باشد یعنی راس شماره ii سفید و اگر 11 باشد یعنی رنگ راس شماره ii سیاه است.

در mm سطر بعدی هر کدوم دو عدد uu و vv آمده است. که نشان دهنده یال‌های گراف است. 1uvn 1 \le u \neq v \le n

خروجی🔗

در صورت امکان پذیر بودن در سطر اول kk که تعداد مراحلی که نیاز دارید تا رنگ همه رئوس را سفید کنید چاپ کنید. 0kn+10 \le k \le n + 1 در kk سطر بعدی در هر سطر یک رشته از 00 و 11 چاپ کنید که عدد iiام آن 11 است اگر راس شماره ii در مرحله iiام در مجموعه SS باشد و در غیر اینصورت 00 خواهد بود.

در صورت امکان پذیر نبودن در تنها سطر خروجی -1 را چاپ کنید.

مثال🔗

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

4 3
0110
1 2
2 3
3 4
Plain text

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

3
0100
0010
1001
Plain text

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

3 3
110
1 2
2 3
3 1
Plain text

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

-1
Plain text

قسمت آموزشی🔗

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

راهنمایی ۱

اول بیاییم یک شرط برای -1 شدن جواب پیدا کنیم.

فرض کنید دو تا راس uu و vv که به هم وصل هستند و مجموعه همسایه های یکسانی دارند، رنگشان فرق دارد. این‌جوری هیچ مجموعه‌ای که دقیقا یکی از این دو راس را شامل شود، نداریم. پس جواب برابر -1 است.

راهنمایی ۲

ابتدا به ازای هر uu و vv که با هم همسایه‌اند و مجموعه همسایه‌هایشان برابر است، یکی را حذف کنید چون رنگ این دو همیشه برابر است و در انتها هر دو سفید می‌شوند. حال راس‌های گراف را بر حسب درجه مرتب کنید. فرض کنید برای هر راس vv می‌توانیم با تعدادی عملیات رنگ vv را عوض کنیم طوری که برای هر uu که degvdegudeg_v \le deg_u رنگ uu ثابت بماند. حال راس هارا به ترتیب درجه از بزرگ بررسی کنید و به هرکس که رسیدید، رنگ او را با عملیات گفته شده تغییر دهید.

راهنمایی ۳

ادعا میکنیم عملیات گفته شده در قبل برای راس vv اینگونه انجام میشود: یکبار SS را برابر تمام ریوس غبر از vv قرار دهید که با vv مجاور نیستند. و یکبار هم SS را برابر با تمام ریوس قرار دهید. بدیهتا عملیات دوم رنگ تمام ریوس را تغییر میدهد پس بیایید عملیات اول را بررسی کنیم: بدیهتا هر راس غیر همسایه vv تغییر میکند و خود vv نیز تغییر نمیکند. پس فقط همسایه های vv میمانند. اگر راس uu داشتیم که degu>degvdeg_u>deg_v رنگ uu تغییر میکند چون به حداقل یک راس غیر همسایه vv وصل است. اگر هم راس uu با درجه برابر vv داشتیم باز هم uu همسایه ای در SS دارد وگرنه مجموعه همسایه های uu و vv برابر بود.

پس با عملیات اول رنگ همه به جز vv و تعدادی از همسایه های با درجه کمترش عوض میشوند و پس از عملیات دوم که رنگ همه عوض میشود انگار فقط رنگ vv و تعدادی راس با درجه کمتر عوض شده است.

با این روش به ازای هر راس حداکثر 2 عملیات انجام داده ایم که یکی از انها روی تمام ریوس بوده است. چون از هر نوع عملیات فقط زوجیت تعداد دفعات ان مهم است پس در مجموع n+1n+1 عملیات داریم.

زمان اجرای این راه حل از O(n3)O(n^3) است که با std::bitset در زمان مطلوب اجرا میشود

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