راهحلهای سؤالات مسابقه الگوریتمی ACM-ICPC Challenge در ادامه توضیح داده شدند. در صورتی که متوجه راهحلی نشدید، میتونید در بخش نظرات، سؤالات و ابهامهای خودتون رو مطرح کنید. اگه راهحل دیگهای برای سؤالات دارید، خوشحال میشیم که راهحلتون رو در بخش نظرات با ما و دوستانتون به اشتراک بذارید.
جواب سؤال valid است اگر به ازای هر ماده (A یا B یا +) در گروه خونی فرزند، آن در حداقل یکی از والدین باشد. نوعی از پیادهسازی تمیز و سریع آن است که به هر گروه خونی یک عدد ۳ بیتی نسبت دهیم که بیتهای آن به ترتیب نشان دهند که ماده A و B و + در گروه خونی هست یا نه. حال اگر عدد متناظر با گروه خونی پدر, مادر و فرزند به ترتیب dad و mom و son باشد، داریم:
حداقل درصد مأمور مخفیها: برای حالت n=1 که بدیهی است. اگر دو طرح با درصدهای x و y داشته باشیم آنگاه پاسخ مشخصا برابر max(0,x+y−100) است. حال اگر n طرح داشته باشیم. میتوانیم جواب را برای n−1 طرح اول حساب کنیم(آن را anspre در نظر میگیریم.) و جواب مشابهاً برابر max(0,anspre+pn−100) است. بنابرین جواب برابر است با
max(0,i=1∑npi−(n−1)×100)
حداکثر درصد مأمور مخفیها: ثابت میکنیم پاسخ این بخش برابر کمینه اعداد است.(آن را m در نظر بگیرید.) مشخصاً پاسخ از m بیشتر نمیتواند باشد چرا که یک طرح m درصد موافق داشتهاست. همچنین ممکن است m درصد افراد به همه طرحها رای مثبت داده باشند.
اگر ستونی شامل دو پریز باشد آنگاه میتوانیم سمت چپ و راست آن را جداگانه حل کنیم. پس در ادامه راه فرض میکنیم ستونی دو پریز ندارد و نیز اگر دیوار بدون پریز باشد جواب مسلماً ۱ است.
حال ادعا میکنیم به کاغذ دیواری با عرض ۲ نیاز نداریم, فرض کنید که کاغذ دیواری 2×k مفید باشد. توجه کنید یک طرف آن حداقل پریز قرار دارد. (در غیر اینصورت یا کلا پریز نداریم و یا کاغذ دیواری مد نظر میتوانست 2×(k+1) باشد.) و میدانیم در ستونی که پریز هست یک خانه خالی هم هست که توسط کاغذ دیواری به ابعاد 1×l پوشانده شده. پس میتوانستیم بدون تغییر کلیت کار بجای 2×k از 1×k و بجای 1×l از 1×(l+k) استفاده کنیم.
بنابرین تنها از پریزهای 1×u استفاده میکنیم و با این فرض کافی است تعداد قسمتهایی که پریزها روی هر سطر درست کردهاند را با هم جمع کنیم.
به موجی k-مکزیکی گوییم که افراد در بلوکهای k تایی ایستاده یا نشسته باشند. همچنین ansk برابر طول بلندترین زیردنباله موج k-مکزیکی است. طبق صورت مسئله جواب برابر
max(ans1,ans2,…,ansn)
است. برای محاسبه ansk کاملاً حریصانه عمل میکنیم. کافی است به ازای هر i که 1≤i≤n موقعیت اولین مکانی از آرایه مانند ai که i+2×k≤ai≤n+1 را بدانیم به طوری که زیر دنباله 2k تایی شامل k نفر نشسته در ابتدا و سپس k نفر ایستاده در بازه [i,ai) موجود باشد. توجه کنید ai ممکن است برای برخی iها وجود نداشته باشد. اگر a1 تعریف شود ansk حداقل 2k است و نیز اگر aa1 تعریف شود آنگاه ansk حداقل 4k است و الی آخر … (حالتی که با k نفر ایستاده شروع شود مشابه است.)
اگر بدانیم هر کس چندمین فرد ایستاده (از سمت چپ) است و نیز مکان افراد ایستاده را در لیستی داشته باشیم آنگاه در O(1) میتوانیم اولین مکان بعد از i مانند j که زیردنباله به طول k از افراد ایستاده در بازه [i,j) موجود است را پیدا کنیم. پس با کمی جزئیات پیادهسازی ai در O(1) قابل محاسبه است بنابرین ansk در زمان O(kn) قابل یافتن است چرا که ansk حداکثر 2×kn بلوک دارد.
همچنین مشابه تحلیل مرتبه الگوریتم غربال اعداد اول داریم:
قصد داریم سؤالی کلیتر را حل کنیم. آرایهای از اعداد داریم و هر مرحله یک عنصر عوض میشود. حال بزرگترین جمع زیربازهای از آرایه چقدر است؟ برای تبدیل سؤالات هم به هم کافی است در خانههای آبی −ai و در خانههای قرمز ai قرار دهیم.
برای حل سؤال از الگوریتم درخت-بازهای (segment-tree) استفاده میکنیم و برای هر گره در درخت ۴ چیز نگه میداریم: جمع کل, جمع بزرگترین زیر بازه, جمع بزرگترین پیشوند و جمع بزرگترین پسوند. (آنها را به ترتیب با sum ، maxall ، maxpre و maxsuf نشان میدهیم.) حال برای ادغام دو گره متوالی L و R داریم:
برای عوض کردن یک خانه کافی است همه بازههای شامل آن خانه را بهروزرسانی کنیم و مقدار maxall ریشه درخت هم هر بار پاسخ مسئله است.
پیچیدگی زمانی: O(n×logn)
راه دیگر سؤال این است که آرایه را به بازههای T تایی تقسیم کنیم و برای هر بازه ۴ مورد گفته شده را نگه داریم. حال برای تغییر یک خانه هزینه زمانی پیچیدگی T دارد و برای پاسخ به بزرگترین جمع زیر بازه چنین عمل میکنیم: یا خانه ای که اخیراً قرمز شده جز جواب است یا جواب جواب قبلی هست. اگر خانه قرمز جز بزرگترین بازه باشد. کافی است بزرگترین پیشوند که عضو اول آن خانه جدید باشد و بزرگترین پسوند منتهی به خانه جدید را بدانیم که در زمان T+Tn هر دو قابل محاسبه هستند و پیچیدگی کلی برابر O(n×(T+Tn)) است که با جایگذاری T=n سؤال حل میشود.
برای هر راس در درخت مانند u، و ارتفاع h، Lu,h را برابر بزرگترین مقدار ممکن برای کمینه عدد درخت جستوجو دودویی کامل به ارتفاع h و با ریشه u در نظر میگیریم. اگر چنین درختی وجود نداشت Lu,h را 0 قرار میدهیم. Ru,h مشابهاً برابر کمترین مقدار ممکن برای بیشینه عدد درخت با مشخصات گفته شده است. و در صورت وجود نداشتن مقدار آن را n+1 قرار میدهیم.
متاسفانه برای حفظ رقابت در بانک سوالات امکان انتشار راهحل این سوال وجود نداره. اگر سوال و یا ابهامی دربارهی راهحل دارید میتونید مطرح کنید، سعی میکنیم راهنماییتون کنیم.