المپدیا

دانش‌نامه‌ی المپیاد کامپیوتر ایران

ابزار کاربر

ابزار سایت


سوالات المپیاد:متفرقه:آزمون های اینترنتی ۸۹ تا ۹۱:سوال ۴۹

Points

‎$m$‎ نقطه روی محور مختصات قرار دارند که هر کدام به یکی از رنگ‌های ‎$1$‎ تا ‎$n$‎ رنگ‌آمیزی شده‌اند‎.

اگر ‎$\text{distance}(x,\text{color})$‎ برابر باشد با کم‌ترین فاصله یک نقطه به رنگ ‎$\text{color}$‎ تا نقطه‌ی ‎$x$‎، تابع ‎$g$‎ به صورت زیر تعریف می‌شود:

‎$$ g(x) = \displaystyle\sum\limits_{i=1}^n \text{distance}(x,i)^2$$‎

شما باید تمام ‎$x$‎هایی را بیابید که هیچ ‎$y$‎ای وجود نداشته باشد به طوری که ‎$g(y) < g(x)$.‎

ورودی

  • در سطر اول ورودی، دو عدد ‎$1 \leq m \leq 10^5$‎ و ‎$1 \leq n \leq 10^4$‎ آمده است.
  • در ‎$m$‎ سطر بعدی، در هر سطر دو صحیح ‎$-10^5 \leq a_i \leq 10^5$‎ و ‎$1 \leq b_i \leq n$‎ آمده است که نشان می‌دهد یک نقطه در ‎$x = a_i$‎ قرار دارد که رنگ آن ‎$b_i$‎ است.

خروجی

  • در سطر اول خروجی تعداد نقاط جواب و در سطرهای بعدی نقاط را به ترتیب صعودی چاپ نمایید.
  • هر عدد را تا دقییقاً ‎۳‎ رقم اعشار چاپ کنید.

محدودیت‌ها

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

ورودی و خروجی نمونه

ورودی نمونه خروجی نمونه
3 5‎
-‎1 3‎
0 1‎
2 3‎
4 2‎
‎5 2
1
2.000
2 5‎
1 1‎
2 2‎
3 1‎
4 2‎
‎5 1
4‎
1.500‎
2.500‎
3.500‎
4.500

‎‎

پاسخ

ابتدا فرض کنید که نقطه‌ها رنگ‌های متفاوتی دارند و این نقاط در مختصات ‎$x_1$‎ تا ‎$x_n$‎ قرار دارند که این‌ها به ترتیب صعودی مرتب شده اند. حالا مقدار تابع ‎$g$‎ را در نقطه‌ی ‎$x=x_i$‎ در نظر بگیرید. فاصله‌ی این نقطه‌ تا ‎$x_j$‎ را ‎$a_j$‎ می‌نامیم. اگر این نقطه را به اندازه‌ی ‎$d$‎ جلو ببریم به صورتی که از نقطه‌ی ‎$x_{i+1}$‎ جلو نزند، در این صورت مقدار ‎$g$‎ در ‎$x+d$‎ به صورت زیر می‌شود:

‎$g(x+d) = \sum_{j=1}^i(a_j+d)^2‎ +‎\sum_{j=i+1}^n(a_j-d)^2 =\sum_{j=1}^n a_j^2‎ +‎n \times d^2+2 \times d \sum_{j=1}^i a_j‎ -‎2 \times d \sum_{j=i+1}^n a_j = g(x_i)‎ + ‎n \times d^2‎ + ‎2 \times d \sum_{j=1}^i a_j‎ - ‎2 \times d \sum _{j=i+1}^n a_j $‎

که ‎$g(x_i)$‎ همیشه مقداری ثابت است و ما دنبال ‎$d$‎ می‌گردیم که ‎$n \times d^2‎ + ‎2 \times d \sum_{j=1}^i a_j‎ - ‎2 \times d \sum_{j=i+1}^n a_j$‎ را کمینه کند. اگر مقدار ‎$alpha(x_i)$‎ را ‎$2 \times \sum_{j=1}^i a_j‎ - ‎2 \times \sum_{j=i+1}^n a_j$‎ بگذاریم می‌خواهیم ببینیم به ازای چه ‎$d$ $n \times d^2+alpha(x_i) \times d$‎ مینیمم می شود.

که این یک عبارت درجه دو برحسب ‎$d$‎ است و کمینه‌ی آن به ازای ‎$d=\frac{(-alpha(x_i))}{2 \times n}$‎. اگر ‎$d$‎ که پیدا می‌کنیم در بازه‌ی ‎۰‎ تا ‎$x_{i+1} – x_i$‎ نیافتاد آنگاه انتهای بازه را به عنوان ‎$d$‎ در نظر می گیریم.حالا به ازای هر ‎$x_i$‎ یک ‎$x+d$‎ بدست می‌آید که در انتها باید بین تمام آنها مینمم بگیریم‎.

‎ الگوریتم بالا را می‌توان در ‎$O(n^2)$‎ پیاده سازی کرد‎.‎‎ (چرا؟) برای بهتر کردن زمان فرض کنید ما در مرحله‌ی ‎$i$‎ ام هستیم یعنی ‎$x=x_i$‎ و در این مرحله ‎$alpha(x_i)$‎ و ‎$g(x_i)$‎ را می‌دانیم. می‌خواهیم با استفاده از این دو عدد ‎$g(x_{i+1})$‎ و ‎$alpha(x_{i+1})$‎ را محاسبه کنیم‎.

‎ برای محاسبه‌ی ‎$g(x_{i+1})$‎ می‌توانیم در همان رابطه‌ی بالا برای به‌دست آوردن ‎$g(x+d)$ $d$‎ را برابر با ‎$x_{i+1} – x_i$‎ قرار دهیم. یعنی:

‎$g(x_{i+1})=g(x_i)+n \times ( x_{i+1} – x_i )^2+alpha(x_i )( x_{i+1} – x_i )$‎

و چون تمام نقاط تاثیرشان در ‎$alpha(x_{i+1} )$‎ زیاد شدن به اندازه ‎$2 \times (x_{i+1} – x_i)$‎است پس رابطه‌ی زیر را هم داریم:

‎$alpha(x_{i+1}) = alpha(x_i )‎+ ‎2 \times n \times (x_{i+1} – x_i)$‎

در ضمن برای نقطه‌ی اول هم می‌توانیم از ‎$O(n)$‎ این دو مقدار را حساب کنیم. پس در کل این الگوریتم از ‎$O(n)$‎ است. حالا به مسئله‌ی اصلی بر می‌گردیم یعنی نقاط می‌توانند رنگ یکسان داشته باشند. ما در قسمت قبل تنها استفاده‌ای که از فرض اضافی‌مان کردیم این بود که محور مختصات را به یکسری بازه تقسیم کردیم که در هر بازه نقاطی که در محاسبه ‎$g$‎ استفاده می‌شدند ثابت بودند و جهت یکسانی با عناصر آن بازه داشتند. در مسئله‌ی اصلی هم چنین افرازی می‌توان پیدا کرد. در این حالت به ازای نقطه‌ی وسط هر دو نقطه‌ی همرنگ متوالی هم یک نقطه‌ی فرضی در نظر بگیرید. این نقاط فرضی به همراه نقاط اصلی محور را به تعدادی دسته افراز می‌کنند که شرط مورد نظر را دارا می باشند و در ضمن تعدادشان از ‎$n$‎ کم‌تر است چون ماکسیمم ‎$n$‎ زوج نقطه داریم که متوالی باشند.(واضح است که اگر روی محور حرکت کنید و جایی نقاط مورد استفاده در محاسبه‌ی ‎$g$‎ تغییر کنند حتما از یکی از نقاط فرضی یا اصلی گذشته‌ایم.)پس به همان ترتیب بالا عمل می‌کنیم. یعنی مجموعه‌ی تمام نقاط اصلی و فرضی را ‎$x_1$‎ تا ‎$x_n$‎ می‌نامیم و همان الگوریتم قسمت اول را اجرا می‌کنیم.


ابزار صفحه