$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)$.
ورودی نمونه | خروجی نمونه |
---|---|
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$ مینامیم و همان الگوریتم قسمت اول را اجرا میکنیم.