.لینکهای مفید برای شرکت در مسابقه:
میتوانید سوالهای خود را از بخش "سوال بپرسید" مطرح کنید. برای حل سوالات در سه سری راهنمایی به انتهای سوالات اضافه میشود. زمان اضافه شدن راهنماییها را میتوانید در قسمت آموزشی پایین سوالات ببینید.
علی که در این گرمای تابستان اعضای شرکت را به اسکیپ روم برده بود برای رفع خستگی تصمیم میگیرد برای آنها نوشابه بخرد... اما میخواهد تنها برای افرادی نوشابه بخرد که بتوانند سوالات زیر را درباره گراف پاسخ دهند...
فرض کنید یک گراف وزن دار بدون جهت همبند باشد. دارای راس و یال است. هر یال دو راس مختلف را به هم متصل میکند.
همچنین راسهای این گراف با ۱ تا شماره گذاری شدهاند. روی راس شماره عدد نوشته شده است.
از ما تعدادی سوال پرسیده میشود. در هر سوال سه عدد و و داده میشود و از ما کوچکترین مقدار را میخواهند که حداقل راس وجود داشته باشند که فاصله آنها از فاصله حداکثر باشد و عدد نوشته شده روی آن نسبت به اول باشد.
منظور از وزن یک مسیر بزرگ ترین عددی است که روی یالهای آن مسیر وجود دارد.
منظور از فاصله دو راس مانند و کمینه مقدار وزن تمام مسیرهای ممکن بین و است.
در سطر اول ورودی سه عدد طبیعی و و با فاصله از هم آمده است که به ترتیب نشان دهنده تعداد رئوس، یالها و سوالاتی است که باید به آنها پاسخ بدهیم. در سطر دوم عدد مانند با فاصله آمده که نشان دهنده اعداد نوشته شده روی رئوس گراف است.
در امین سطر از سطر بعدی، سه عدد و و عدد آمده است که نشاندهنده وجود یالی با وزن بین دو راس و است. دقت کنید که لزومی ندارد گراف ساده باشد و ممکن است طوقه یا یال چندگانه داشته باشیم.
در امین سطر از سطر بعدی، سه عدد و و آمده است که نشان دهنده سوال علی از شماست؟
در سطر خروجی در سطر ام پاسخ سوال ام را چاپ کنید.
در این قسمت راهنماییهای سوال، به مرور اضافه میشود. مشکلاتتان در راستای حل سوال را میتوانید از بخش "سوال بپرسید" مطرح کنید.
در ابتدا برای حل مسئله، mst گراف را در نظر میگیریم. برای این کار از الگوریتم kruskal با dsu استفاده میکنیم. حال درخت باینری را بدینشکل میسازیم که برگ و غیر برگ داشته باشد و هر برگ آن متناظر یکی از رئوس گراف اولیه و هر غیر برگ آن متناظر یکی از یال های mst بوده و دقیقا 2 بچه داشته باشد.
اگر در برگ های هر زیردرخت را بگیریم، در mst تشکیل یک زیرگراف همبند میدهند که زمانی یکی از مولفه های همبندی dsu بوده است. این درخت را همزمان با پیدا کردن mst میسازیم بدینصورت که برای هر مولفه در dsu شماره راس ریشه آن را نگه میداریم و موقع ادغام کردن دو مولفه، یک راس ریشه جدید ساخته و parent ریشههای دو مولفه قبلی را راس جدید میگذاریم و راس جدید را هم برابر وزن یال متناظرش در mst قرار میدهیم.
فرض کنید جعبهای داریم که دو عملیات زیر را در برای دامنه موجود در صورت مسئله انجام میدهد.
add x
عدد را به دنباله اضافه میکند.get x
تعداد اعضای که نسبت به اول هستند را برمیگرداند.برای این کار را تعریف میکنیم را تعداد اعداد که مضرب هستند. حال برای پرسش نوع دوم از اصل شمول و عدم شمول استفاده میکنیم. به ازای هر مجموعه از عوامل اول مانند که ضرب اعضایش است، مقدار را به جواب اضافه میکنیم. چون همه ها حداکثر اند، پس حداکثر ۶ عامل اول متفاوت دارند و هر درخواست در انجام میشود.
حال به سوال اصلی باز گردیم. برای جواب دادن کوئریهای ورودی، میتوانیم از Binary Search روی جواب استفاده کنیم.
پاسخ درخواستی که به شکل v x w
داده میشود، تعداد رئوسی است که عدد نوشته شده بر روی آنها، نسبت به اول است و فاصلهشان تا حداکثر است. همچنین میدانیم تمام راسهایی که شرط فاصله برایشان برقرار است، برگ های یک زیردرخت از هستند.
پس میتوانیم همه آنها را به جعبه اضافه کرده و در انتها جواب را از جعبه بپرسیم ولی پیچیدگی زمانی این راه بیش از حد مطلوب ماست.
برای بهتر کردن راه قبل میتوان از Parallel Binary Search یا باینری سرچ موازی استفاده کرد. میخواهیم همزمان جواب کوئریهای سوال را حساب کنیم. برای اینکار روی انها همزمان باینری سرچ میزنیم و
بار جواب همه کوئری های v x subtree
را حساب میکنیم. برگ های را بر حسب starting time مرتب کنید. حال هر کویری معادل برگ های یک بازه است که هر کدام معادل دو کویری پریفیکس است. برای جواب دادن کویری های پریفیکس هم برگ ها را به ترتیب به جعبه اضافه کنید و به هر کویری که رسیدید آن کویری را از جعبه بپرسید.
پیچیدگی زمانی: