結果
問題 |
No.3016 ハチマキおじさん
|
ユーザー |
|
提出日時 | 2025-01-31 18:50:14 |
言語 | D (dmd 2.109.1) |
結果 |
AC
|
実行時間 | 239 ms / 2,000 ms |
コード長 | 1,478 bytes |
コンパイル時間 | 3,077 ms |
コンパイル使用メモリ | 213,828 KB |
実行使用メモリ | 18,372 KB |
最終ジャッジ日時 | 2025-01-31 18:50:25 |
合計ジャッジ時間 | 10,562 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 31 |
ソースコード
import std; void main () { int N = readln.chomp.to!int; auto A = readln.split.to!(int[]); auto B = readln.split.to!(int[]); // ハチマキの本数がキモ // 一本消したとき、昇順同士でマッチさせるしかない。 // となると、前i本同士でマッチングさせたときのコストと // 後ろi本同士でマッチングさせたときのコストがわかれば一本抜いた時のコストがわかる。 auto acc = new long[](N); auto racc = new long[](N); A.sort; B.sort; foreach (i; 0 .. N - 1) { acc[i + 1] = acc[i] + abs(A[i] - B[i]); } foreach (i; 0 .. N - 1) { racc[i + 1] = racc[i] + abs(A[$ - i - 1] - B[$ - i - 1]); } auto score = new Tuple!(int, long)[](0); foreach (i; 0 .. N) { // A[i]を消す score ~= tuple(A[i], acc[i] + racc[N - 1 - i]); } score.sort!((a, b) => a[1] < b[1]); auto ans = new int[](0); int l = 0, r = 0; while (l < N) { while (r < N) { if (score[l][1] != score[r][1]) break; r++; } foreach (i; l .. r) ans ~= score[i][0]; break; } ans = ans.sort.uniq.array; writeln(ans.length); writefln("%(%s %)", ans); } void read (T...) (string S, ref T args) { import std.conv : to; import std.array : split; auto buf = S.split; foreach (i, ref arg; args) { arg = buf[i].to!(typeof(arg)); } }