結果

問題 No.3739 Stronger Network
コンテスト
ユーザー hiro1729
提出日時 2026-09-19 17:55:38
言語 C++23
(gcc 15.3.0 + boost 1.92.0 + ACL)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
WA  
実行時間 -
コード長 2,336 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,689 ms
コンパイル使用メモリ 351,456 KB
実行使用メモリ 32,644 KB
最終ジャッジ日時 2026-09-19 17:55:52
合計ジャッジ時間 6,615 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge3_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 39 WA * 9
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main() {
	ios::sync_with_stdio(false); cin.tie(nullptr);

	int H, W; cin >> H >> W;
	if (H % 2 == 1 || W % 2 == 1) {
		cout << "-1\n";
		return 0;
	}
	vector<int> gh, gw;
	for (int i = 1; i < 20; i++) {
		vector<int> gi;
		for (int j = 0; j < (1 << i); j++) {
			gi.push_back(countr_zero((unsigned)(j + 1)));
		}
		gi.back() = (i - 1);
		if (H & (1 << i)) {
			vector<int> ngh;
			if (gh.size() == 0) {
				ngh = gi;
			} else {
				ngh.push_back(i);
				for (int j: gh) ngh.push_back(j);
				ngh.back() = i;
				int l = find(gi.begin(), gi.end(), gh.back()) - gi.begin();
				for (int j = 1; j < (1 << i); j++) ngh.push_back(gi[(l + j) % (1 << i)]);
			}
			gh = ngh;
		}
		if (W & (1 << i)) {
			vector<int> ngw;
			if (gw.size() == 0) {
				ngw = gi;
			} else {
				ngw.push_back(i);
				for (int j: gw) ngw.push_back(j);
				ngw.back() = i;
				int l = find(gi.begin(), gi.end(), gw.back()) - gi.begin();
				for (int j = 1; j < (1 << i); j++) ngw.push_back(gi[(l + j) % (1 << i)]);
			}
			gw = ngw;
		}
	}
	int mh = *max_element(gh.begin(), gh.end()) + 1, mw = *max_element(gw.begin(), gw.end()) + 1;
	vector<vector<int>> ans;
	int ansm = 1e9;
	// h
	for (int l = 0; l <= mw; l++) {
		vector<int> P(H), Q(W);
		for (int i = 0; i < H - 1; i++) {
			P[i + 1] = P[i] ^ (1 << (l + gh[i]));
		}
		for (int i = 0; i < W - 1; i++) {
			Q[i + 1] = Q[i] ^ (1 << (gw[i] < l ? gw[i] : mh + gw[i]));
		}
		vector<vector<int>> nans(H, vector<int>(W));
		int nm = 0;
		for (int i = 0; i < H; i++) {
			for (int j = 0; j < W; j++) {
				nans[i][j] = P[i] | Q[j];
				nm = max(nm, nans[i][j]);
			}
		}
		if (nm < ansm) {
			ansm = nm; ans = nans;
		}
	}
	// w
	for (int l = 0; l <= mh; l++) {
		vector<int> P(H), Q(W);
		for (int i = 0; i < H - 1; i++) {
			P[i + 1] = P[i] ^ (1 << (gh[i] < l ? gh[i] : mw + gh[i]));
		}
		for (int i = 0; i < W - 1; i++) {
			Q[i + 1] = Q[i] ^ (1 << (l + gw[i]));
		}
		vector<vector<int>> nans(H, vector<int>(W));
		int nm = 0;
		for (int i = 0; i < H; i++) {
			for (int j = 0; j < W; j++) {
				nans[i][j] = P[i] | Q[j];
				nm = max(nm, nans[i][j]);
			}
		}
		if (nm < ansm) {
			ansm = nm; ans = nans;
		}
	}
	for (int i = 0; i < H; i++) {
		for (int j = 0; j < W; j++) {
			cout << ans[i][j] << (j == W - 1 ? '\n' : ' ');
		}
	}
}
0