結果
| 問題 |
No.2548 Problem Selection
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-11-20 17:22:01 |
| 言語 | D (dmd 2.109.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 790 bytes |
| コンパイル時間 | 4,441 ms |
| コンパイル使用メモリ | 178,176 KB |
| 実行使用メモリ | 5,756 KB |
| 最終ジャッジ日時 | 2024-09-26 06:40:18 |
| 合計ジャッジ時間 | 3,780 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 12 WA * 13 |
ソースコード
import std;
void main () {
int N, M; readln.read(N, M);
int[] A = readln.split.to!(int[]);
/* 明らかに連続部分列が最適 -> 連続部分列を全部見れば良い -> スライドしていけば高々N回の更新で終わり */
A.sort;
// 最初の一回
long S = 0;
foreach (i; 1..M) S += (1L*(A[i] - A[i-1]))^^2;
long ans = S;
int left = 0, right = M-1;
while (right < M) {
// rightを新しく追加し、leftを追放
S -= (1L*A[left+1]-A[left])^^2;
S += (1L*A[right+1]-A[right])^^2;
left++, right++;
ans = min(ans, S);
}
writeln(ans);
}
void read(T...)(string S, ref T args) {
auto buf = S.split;
foreach (i, ref arg; args) {
arg = buf[i].to!(typeof(arg));
}
}