B - プレイリストの最適化 / Playlist Optimization Editorial by admin
claude4.8opus-highOverview
This problem asks us to rearrange and play \(N\) tempo values in an order that minimizes the total discomfort score, which is accumulated based on the rule: “if there was no similar song played just before, we pay the difference between the current song and the previous one.” Sorting the tempo values, the answer is the sum of the differences between adjacent values that exceed \(D\) (the gaps).
Analysis
Treating Similar Songs as “Groups”
First, let us sort the tempo values in ascending order. If the difference between two adjacent values after sorting is at most \(D\), these two songs are considered “similar.”
The key observation here is that if we play them in the sorted order, similar songs can be chained together continuously.
For example, suppose \(D = 2\) and the values are \(1, 3, 10, 12\). The differences between adjacent elements after sorting are: - \(3 - 1 = 2\) (\(\leq D\), similar) - \(10 - 3 = 7\) (\(> D\), not similar) - \(12 - 10 = 2\) (\(\leq D\), similar)
Thus, grouping the songs connected by differences of at most \(D\) results in two “groups (clusters)”: \(\{1, 3\}\) and \(\{10, 12\}\).
Cost Within a Group Can Be Made 0
If we play a group in ascending order, from the second song onwards, the difference with the “immediately preceding song” is always at most \(D\). Thus, a similar song has already been played. Therefore, the discomfort score is \(0\).
In other words, no matter how many songs within the same group we play, no additional cost is incurred.
Cost Incurred Only When Crossing Groups
When we play the groups in sorted order, a cost is incurred only when transitioning from the end (maximum value) of one group to the beginning (minimum value) of the next group. This difference is precisely the value of the “gap exceeding \(D\)” in the sorted array.
Since the destination song has a difference greater than \(D\) from all previously played songs (which all belong to smaller groups), we must pay the discomfort score \(|B_j - B_{j-1}|\), which is equal to the gap value.
In the previous example, transitioning from \(3 \to 10\) incurs a cost of \(7\), making the total cost \(7\).
Why This is Optimal
Gaps with differences exceeding \(D\) act like “impassable walls” partitioning the number line of tempo values. Since we must play all songs, we must “start playing” each group for the first time at least once, which inevitably requires jumping from some other group. The width of this jump must be at least the size of the partitioning gap. Playing the songs in sorted order achieves exactly this lower bound, making it optimal.
In conclusion, the answer is the sum of the adjacent differences after sorting that exceed \(D\).
Algorithm
- Sort the array of tempo values.
- Iterate through the differences of adjacent elements:
diff = a[i] - a[i-1]. - If
diff > D, adddiffto the answer. - Output the total sum.
Note that if \(N \leq 1\), no cost is incurred, so we output \(0\). Also, if \(D\) is large enough such that all differences are at most \(D\), the answer is \(0\).
Complexity
- Time Complexity: \(O(N \log N)\) (dominated by sorting)
- Space Complexity: \(O(N)\)
Implementation Details
Since \(N\) can be as large as \(10^6\), fast I/O is necessary. For example, in Python, we can read the entire input at once using
sys.stdin.buffer.read()and then split it.The answer can be up to around \(N \times 10^9\), but since Python’s integers support arbitrary precision, there is no need to worry about overflow (in languages like C++, you should use
long long).Since we only need to scan the adjacent differences once after sorting, no additional data structures are required.
Source Code
import sys
def main():
data = sys.stdin.buffer.read().split()
n = int(data[0])
d = int(data[1])
if n <= 1:
print(0)
return
a = [int(x) for x in data[2:2 + n]]
a.sort()
ans = 0
prev = a[0]
for i in range(1, n):
cur = a[i]
diff = cur - prev
if diff > d:
ans += diff
prev = cur
print(ans)
main()
This editorial was generated by claude4.8opus-high.
posted:
last update: