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

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

نوشابه خنک


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

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

فرض کنید GG یک گراف وزن دار بدون جهت همبند باشد. GG دارای nn راس و mm یال است. هر یال GG دو راس مختلف را به هم متصل می‌کند.

همچنین راس‌های این گراف با ۱ تا nn شماره گذاری شده‌اند. روی راس شماره ii عدد aia_i نوشته شده است.

از ما تعدادی سوال پرسیده می‌شود. در هر سوال سه عدد vv و xx و kk داده می‌شود و از ما کوچک‌ترین مقدار ww را می‌خواهند که حداقل kk راس وجود داشته باشند که فاصله آن‌ها از vv فاصله حداکثر ww باشد و عدد نوشته شده روی آن نسبت به xx اول باشد.

منظور از وزن یک مسیر بزرگ ترین عددی است که روی یال‌های آن مسیر وجود دارد.

منظور از فاصله دو راس مانند uu و vv کمینه مقدار وزن تمام مسیرهای ممکن بین uu و vv است.

ورودی🔗

در سطر اول ورودی سه عدد طبیعی nn و mm وqq با فاصله از هم آمده است که به ترتیب نشان دهنده تعداد رئوس، یال‌ها و سوالاتی است که باید به آن‌ها پاسخ بدهیم. 1n,m,q100 0001 \le n, m, q \le 100\ 000 در سطر دوم nn عدد مانند a1,a2,a3,...,ana_1, a_2, a_3,..., a_n با فاصله آمده که نشان دهنده اعداد نوشته شده روی رئوس گراف است.

در iiامین سطر از mm سطر بعدی، سه عدد viv_i و uiu_i و wiw_i عدد آمده است که نشان‌دهنده وجود یالی با وزن wiw_i بین دو راس viv_i و uiu_i است. دقت کنید که لزومی ندارد گراف ساده باشد و ممکن است طوقه یا یال چندگانه داشته باشیم. 1ui,vin1 \le u_i, v_i \le n 1wi1091 \le w_i \le 10^9

در jjامین سطر از qq سطر بعدی، سه عدد vjv_j و xjx_j و kjk_j آمده است که نشان دهنده سوال علی از شماست؟1ai,xj500 0001 \le a_i, x_j \le 500\ 000 1vjn1 \le v_j \le n 2kjn2 \le k_j \le n

خروجی🔗

در qq سطر خروجی در سطر iiام پاسخ سوال iiام را چاپ کنید.

مثال🔗

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

3 3 2
6 9 5
1 2 10
2 3 20
1 3 30
3 7 2
1 25 2
Plain text

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

20
10
Plain text

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

4 3 4
1 2 3 4
1 2 10
2 3 1
3 4 2
3 3 2
4 5 3
4 5 4
1 2 4
Plain text

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

2
2
10
-1
Plain text

قسمت آموزشی🔗

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

راهنمایی ۱

در ابتدا برای حل مسئله، mst گراف را در نظر می‌گیریم. برای این کار از الگوریتم kruskal با dsu استفاده میکنیم. حال درخت باینری TT را بدین‌شکل می‌سازیم که nn برگ و n1n-1 غیر برگ داشته باشد و هر برگ آن متناظر یکی از رئوس گراف اولیه و هر غیر برگ آن متناظر یکی از یال های mst بوده و دقیقا 2 بچه داشته باشد.

اگر در TT برگ های هر زیردرخت را بگیریم، در mst تشکیل یک زیرگراف همبند می‌دهند که زمانی یکی از مولفه های همبندی dsu بوده است. این درخت را همزمان با پیدا کردن mst می‌سازیم بدین‌صورت که برای هر مولفه در dsu شماره راس ریشه آن را نگه می‌داریم و موقع ادغام کردن دو مولفه، یک راس ریشه جدید ساخته و parent ریشه‌های دو مولفه قبلی را راس جدید می‌گذاریم و valuevalue راس جدید را هم برابر وزن یال متناظرش در mst قرار می‌دهیم.

راهنمایی ۲

فرض کنید جعبه‌ای داریم که دو عملیات زیر را در O(26)O(2^6) برای دامنه xx موجود در صورت مسئله انجام می‌دهد.

  • add x عدد xx را به دنباله AA اضافه می‌کند.
  • get x تعداد اعضای AA که نسبت به xx اول هستند را برمی‌گرداند.

برای این کار cntxcnt_x را تعریف می‌کنیم را تعداد اعداد AA که مضرب xx هستند. حال برای پرسش نوع دوم از اصل شمول و عدم شمول استفاده می‌کنیم. به ازای هر مجموعه از عوامل اول xx مانند SS که ضرب اعضایش yy است، مقدار (1)Scnty(-1)^{|S|}*cnt_y را به جواب اضافه می‌کنیم. چون همه xx ها حداکثر 500 000500\ 000 اند، پس حداکثر ۶ عامل اول متفاوت دارند و هر درخواست در O(26)O(2^6) انجام می‌شود.

حال به سوال اصلی باز گردیم. برای جواب دادن کوئری‌های ورودی، می‌توانیم از Binary Search روی جواب استفاده کنیم.

پاسخ درخواستی که به شکل v x w داده می‌شود، تعداد رئوسی است که عدد نوشته شده بر روی آن‌ها، نسبت به xx اول است و فاصله‌شان تا vv حداکثر wwاست. همچنین می‌دانیم تمام راس‌هایی که شرط فاصله برایشان برقرار است، برگ های یک زیردرخت از TT هستند. پس می‌توانیم همه آن‌ها را به جعبه اضافه کرده و در انتها جواب را از جعبه بپرسیم ولی پیچیدگی زمانی این راه بیش از حد مطلوب ماست.

راهنمایی ۳

برای بهتر کردن راه قبل میتوان از Parallel Binary Search یا باینری سرچ موازی استفاده کرد. میخواهیم همزمان جواب کوئری‌های سوال را حساب کنیم. برای اینکار روی انها همزمان باینری سرچ میزنیم و O(log(n))O(log(n)) بار جواب همه کوئری‌ های v x subtree را حساب میکنیم. برگ های TT را بر حسب starting time مرتب کنید. حال هر کویری معادل برگ های یک بازه است که هر کدام معادل دو کویری پریفیکس است. برای جواب دادن کویری های پریفیکس هم برگ ها را به ترتیب به جعبه اضافه کنید و به هر کویری که رسیدید xx آن کویری را از جعبه بپرسید.

پیچیدگی زمانی: O((n+q).log(n).26)O((n+q).log(n).2^6)

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