結果
問題 |
No.3219 Ruler to Maximize
|
ユーザー |
![]() |
提出日時 | 2025-08-01 22:26:48 |
言語 | D (dmd 2.109.1) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,104 bytes |
コンパイル時間 | 1,683 ms |
コンパイル使用メモリ | 93,716 KB |
実行使用メモリ | 7,720 KB |
最終ジャッジ日時 | 2025-08-01 22:26:54 |
合計ジャッジ時間 | 5,018 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 15 WA * 17 |
ソースコード
import std.stdio, std.algorithm, std.array, std.conv, std.typecons; void main() { readln; auto A = readln.split.to!(ulong[]); auto N = A.length; Set[2^^12] realize; ulong[Set] or_vals; or_vals[Set(0, 0)] = 0; foreach (i, a; A) foreach (set, val; or_vals) { auto set2 = add(set, i); auto val2 = val | a; // new value if (realize[val2] == Set(0, 0)) realize[val2] = set2, or_vals[set2] = val2; } ulong[Set] wb_vals; foreach (set, val; or_vals) { ulong b; foreach (i, a; A) if (!i.is_in(set)) b |= a; if ((val & b) == 0) wb_vals[set] = val * b; } Set ans; foreach (set, val; wb_vals) { if (val > wb_vals[ans]) ans = set; } writeln(wb_vals[ans]); foreach (i; 0 .. N) { write(i.is_in(ans) ? "W" : "B"); } writeln; } alias Set = Tuple!(ulong, ulong); bool is_in(ulong i, Set a) { if (i <= 63) return (a[0] & 2^^i) != 0; else return (a[1] & 2^^(i-64)) != 0; } Set add(Set a, ulong i) { if (i <= 63) a[0] |= 2^^i; else a[1] |= 2^^(i-64); return a; } Set remove(Set a, ulong i) { if (i <= 63) a[0] &= ~(2^^i); else a[1] |= ~(2^^(i-64)); return a; }