結果

問題 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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;
}
0