اولین باره که به کاهو میای؟ راهنمای سایت رو حتما بخون!

ورود ثبت‌نام راهنما درباره‌ی کاهو
پرسش‌ها برچسب‌ها کاربر‌ها سوال بپرسید!

آمار پرسش:

  • پرسیده شده: 2019-08-16 02:22:20 -0500
  • مشاهده شده: 1,199 بار
  • بروز شده: 2019-08-27 05:54:05 -0500

پرسش‌های مشابه:

مادر بزرگ - آزمون آزمایشی ۲۴ مین دوره المپیاد کامپیوتر-دوره تابستان المپیاد کامپیوتر ۱۳۹۳

آشپزباشی:‌ مرتب کردن پشته با برعکس کردن یک دنباله متوالی از ابتدای آن

تعداد مثلث های پوشاننده

مدرسه تابستانی المپیاد کامپیوتر چه خبره؟

آزمون عملی (مرحله سوم) المپیاد کامپیوتر چطور برگزار میشه و برای آمادگیش چیکار کنیم؟

تبدیل جدول با چرخش‌های ساعتگرد مربع $2\times 2$

دنباله ی درجات گراف

جاج برای سوالات فاینال امتحان های عملی دوره ی تابستانی

حدس زدن کارت پنجم با انتخاب ترتیب دادن ۴ کارت

گراف در دوره ی تابستانی

نکاتی در مورد نوشتن پاسخ:

در این قسمت می‌تونی به یک پرسش پاسخ بدی. اگه می‌خوای در مورد پرسش بحث و اظهار نظر کنی از قسمت «ثبت نظر» استفاده کن.
پاسخت رو دقیق و کامل بنویس، از عکس استفاده کن و اگه لازمه به منابع (کتاب یا سایت) ارجاع بده.
اگه پرسش یا پاسخ‌ها مفید هستند حتما بهشون رای بده تا پرسش‌ها و پاسخ‌های خوب مشخص بشن.

استفاده از ویرایشگر:

توی قسمت پیش‌نمایش می‌تونی ببینی متنی که نوشتی چجوری روی سایت دیده میشه.
خیلی مهم: برای اینکه به خط بعد بری باید دوتا Enter بزنی.
می‌تونی از تگ‌های معمولی و ساده‌ی html هم استفاده کنی.
با دکمه‌هایی که بالای ویرایش‌گر قرار دارند کلی کار می‌شه کرد. از عکس‌گذاشتن بگیر تا لیست شماره‌دار. حتما امتحان‌شون کن.

علائم ریاضی:

برای نوشتن علائم ریاضی می‌تونی از Mathjax استفاده کنی. راهنمای Mathjax رو از سایت math.stackexchange بخون.
برای نوشتن عبارت ریاضی وسط جمله، اون عبارت رو بین دوتا $ قرار بده.
برای نوشتن عبارت ریاضی تو یه خط جدید اون رو بین دوتا $$ قرار بده.

تخمین رتبه-۲۴امین دوره المپیاد کامپیوتر - آزمون دوم - :

2

یکی از دانش‌پژوهان ورزشکار المپیاد کامپیوتر، بعد از زدن سرویس پرشی در بازی والیبال مصدوم شده و خانم دکتر برای مداوای او به باشگاه آمده‌است. خانم دکتر بعد از مداوای او متوجه صف بلندی از دانش‌پژوهان المپیاد کامپیوتر روبروی در سایت می‌شود، یک صف بسیار بلند که برای اعلام نتیجه‌ی آزمون عملی دوم تشکیل شده‌است. به دلایل نامعلوم (احتمالن قوی بودن تست‌کیس‌ها) مدت زیادی است که بچه‌ها منتظرند و نتیجه‌ای اعلام نشده‌است. برای همین بچه‌ها خودشان سعی دارند رتبه‌ای حدودی برای خود تخمین بزنند.

روش آن‌ها به این صورت است که k نفر اول صف بر اساس عملکردی که در آزمون داشته‌اند هر کدام تخمینی اولیه از رتبه‌ی خود می‌زنند و بقیه‌ی افراد صف با توجه به رتبه‌ی افراد جلوی خود، یک رتبه تخمینی برای خود در نظر می‌گیرند. آن‌ها به ترتیب (ابتدا فرد k+1-ام ، سپس k+2-ام و ...)‌ به این صورت رتبه‌ی خود را تخمین می‌زنند که رتبه‌ی k نفر جلوی خود را می‌پرسند (یعنی فرد i-ام صف از افراد i−k-ام تا i-1-ام صف رتبه‌‌ی تخمینی‌شان را می‌پرسد) و با توجه به این که خیلی خوش‌بین هستند، کوچکترین رتبه‌ای را که هیچ‌ یک از k نفر جلویی برای خود در نظر نگرفته را به عنوان رتبه‌ی خود در نظر می‌گیرند.

ورودی

در سطر اول ورودی به ترتیب دوعدد طبیعی k و n آمده است.

سطر دوم دنباله‌ی $ 1a ​ ,a 2 ​ ,...,a k$ ​ را نشان می‌دهد که در آن a i ​ تخمین اولیه فرد i-ام صف است.

ممکن است در بین k نفر اول دو نفر رتبه‌ی یکسانی تخمین زده باشند.

1 $≤k ≤ 1000000 $

k < n ≤10^12$ $

$0≤a 1 ​ ,a 2 ​ ,...,a k ​ ≤10 ^ 9 $

خروجی

در تنها سطر خروجی تخمینی که فرد n-ام صف از رتبه‌ی خود دارد را چاپ کنید.

++C دوره-تابستانی مقدماتی دوره۲۴
2019-08-16 02:22:20 -0500
آلفا برنامه نویس 31 ● 2 ● 2 ● 6
پاک‌کردن   ویرایش سوال
نظرات

سلام این سوالت همچنان بد افتاده :) راهنمای mathjax رو بخون.

2019-08-24 02:58:41 -0500 غزوو

http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference

2019-08-24 02:58:52 -0500 غزوو

2 پاسخ

1

توضیح الگوریتم:

رتبه ای که فرد $i$ام برای خودش تخمین میزند را با $r_i$ نشان میدهیم.

لم1: به ازای $i>k$ داریم: $r_i \le k+1$

اثبات: از آنجا که این مقادیر از ورودی گرفته نمیشوند، در نتیجه این افراد برای تخمین رتبه ی خود به $k$ نفر جلوی خود نگاه میکنند. واضح است که کوچکترین رتبه ی انتخاب نشده بین این $k$ نفر با توجه به اصل لانه کبوتری حداکثر $k+1$ است. پس $r_i \le k+1$.

لم2: در دنباله ی $r_{k+1}, r_{k+2}, r_{k+3}, ...$ به ازای هر زیر دنباله ی متوالی $k+1$ تایی تمام اعداد 1 تا $k+1$ دقیقا یکبار دیده میشوند.

اثبات: با برهان خلف حکم را اثبات میکنیم. فرض کنید اینگونه نباشد. پس یعنی دو عدد $i$ و $j$ یافت میشوند بطوریکه: $k < i < j$ و $j-i \le k$ همچنین $r_i=r_j$ . فرد $j$ام را در نظر بگیرید. این فرد هنگامی که میخواسته رتبه ی خود رو تخمین بزند رتبه ی تخمینی فرد $i$ ام را پرسیده. پس نباید رتبه ای برای خود تخمین میزند با آن برابر باشد. در نتیجه فرض خلف باطل و حکم ثابت میشود.

لم3: به ازای $2k+2 \le i$ داریم: $r_i=r_{(i) mod (k+1) + k+1}$

با استقرا حکم را ثابت میکنیم:

پایه ی استقرا: فرض کنید $i=2k+2$. در این صورت با توجه به لم2 میدانیم در دنباله ی $r_{i-k-1}, r_{i-k}, ... ,r_{i-2} r_{i-1}$ تمام اعداد 1 تا $k+1$ هر کدام دقیقا یکبار دیده شده اند. از طرفی باز هم با توجه به لم2 میدانیم در دنباله ی $r_{i-k}, r_{i-k+1}, ... ,r_{i-1} r_i$ نیز هر کدام از اعداد 1 تا $k+1$ دقیقا یکبار دیده شده اند. از این دو موضوع به راحتی نتیجه میشود که $r_i=r_{i-k-1}$ پس $r_{2k+2}=r_{k+1}$

فرض استقرا : به ازای هر $j$ بطوری که $2k+2 \le j$ و $j< i$ داریم: $r_i=r_{(i) mod (k+1) + k+1}$

حکم استقرا: با استدلالی شبیه پایه ی استقرا به این میرسیم که$r_i=r_{i-k-1}$ و با توجه به فرض استقرا به این میرسیم که $r_i=r_{(i) mod (k+1) + k+1}$ و حکم ثابت میشود.

حال با توجه به لم3 برای یافتن $r_n$ کافیست که به رتبه ی تخمینی فرد $k+1$ام تا $2k+1$ ام را بیابیم. برای یافتن آن از سگمنت تری استفاده میکنیم و درختی دودویی با $k+1$ برگ میسازیم.

درخت را به گونه ای میسازیم که کوچکترین عدد بازه ی دلخواه را به ما نشان بدهد. البته ما در این سوال فقط از کوچکترین عدد کل برگ ها استفاده میکنیم. بهمین دلیل نیازی به تابع $query$ نداریم. ساخت درخت به این صورت است که در ابتدا $k$ عدد را از ورودی میگیریم. حال روی برگ $i$ ام عدد $j$ را به این صورت مینویسیم:

  1. اگر عددی از ورودی هایمان $i$ بود $j=i$

  2. در غیر اینصورت $j=\infty$

همچینین فرض کنید در هنگام گرفتن ورودی $i$ام اگر مقدار ورودیمان کوچکتر یا مساوی $k$ بود به مقدار $h_i$ یک واحد اضافه کنیم. (در ابتدا تمام $h_i$ ها را مساوی 0 قرار میدهیم.)

حال الگوریتم زیر را انجام میدهیم: (فرض کنید مقدار راس $i$ام درخت را با $t_i$ نشان دهیم)

1_ به ازای $i=k+1$ تا زمانی که $i \le 2k+1$ کار های زیر را انجام بده و به مقدار $i$ یک واحد اضافه کن:

1_1_مقدار $r_i=t_1$ ($t_1 $ ریشه ی درخت است و عدد روی آن کوچکترین عدد کل بازه است)

1_2_ به مقدار $h_{t_1}$ یک واحد اضافه کن و عدد برگ $t_1$ ام را برابر $\infty$ قرار بده.

1_3_ اگر $i-k$ امین ورودی ای که گرفتیم برابر $j$ باشد از مقدار $h_j$ یک واحد کم کن.

1_4_ اگر $h_j=0$ شد مقدار برگ $j$ام درخت را برابر $j$ قرار بده.

میبینید که به وسیله ی الگوریتم بالا میتوانیم به خواسته مان برسیم. چون هر بار که فردی از افراد $k+1$ ام تا $2k+1$ ام بخواهد رتبه اش را تخمین بزند کوچکترین برگ را میابد و آن را به عنوان رتبه میپذیرد. در ادامه مقادیر درخت آپدیت میشوند و اگر رتبه ای بین $k$ نفر جلوی فردی که میخواهیم رتبه اش را تخمین بزنیم باشد مقدار برگ متناظر آن را برابر $\infty$ قرار میدهیم. و در صورتی هم که رتبه ای انتخاب نشده باشد مقدار برگ متناظرش را برابر خودش قرار میدهیم.

در نهایت الگوریتم با پیچیدگی زمانی $O(klgk)$ ما را به جواب میرساند.


توضیحات کد:

در کد توابع build و update به ترتیب درخت را میساند و آپدیت میکنند.درون آرایه ی b مقادیر رتبه های تخمینی را قرار میدهیم. همچنین با توجه به لم1 مقادیر بزگ تر از $k+1$ در ورودی ها بدرد ما نمخوند و آنها را آپدیت نمکنیم.

مشاهده ی کد (C++)

2019-08-23 04:21:25 -0500
غزوو 1304 ● 7 ● 14 ● 24
پاک‌کردن   ویرایش پاسخ
نظرات

گفتم اضافه کنم همونکار سگمنتی که من اینجا زدم رو میشه با set انجام داد :) یکمی سخت فکر کردم راه حلم اینجوری شد! البته توی اردر تاثیری نداره

2019-08-27 05:55:13 -0500 غزوو
1

من اینو با سگمنت تری نزدم

در واقع کاری که باید بکنی اینه که بیای و k+1 نفر بعد از k نفر اول رو حدس بزنی

بعد اثبات میشه کرد که این k+1 تا هی تکرار میشند. و این k+1 تا هم تخمینشون عددی بین 1 و k است.

2019-08-27 00:44:02 -0500
یکی از ملت 21
پاک‌کردن   ویرایش پاسخ
نظرات

من از این راه سوال را حل کردم اما در اعداد بزرگ به مشکل بر میخورد

2019-09-06 07:49:23 -0500 آلفا برنامه نویس

منم اول این ایده به ذهنم رسید ولی پیاده کردنش مشکله

2021-04-21 05:58:38 -0500 تابستون

پاسخ شما

فقط در صورتی که پاسخی برای این پرسش دارید، آن را اینجا بنویسید و برای بحث کردن از قسمت «ثبت‌ نظر» استفاده کنید. شما می‌توانید قبل از وارد شدن به سایت پاسخ خود را بنویسید. این پاسخ ذخیره می‌شود و زمانی که شما وارد سایت شدید یا ثبت‌نام کردید منتشر می‌شود.

پیش‌نمایش:

کلیه‌ی حقوق این سایت متعلق به کمیته‌ی ملی المپیاد کامپیوتر است.