社区讨论

ABC E求调

学术版参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m6m9g6xl
此快照首次捕获于
2025/02/01 22:00
去年
此快照最后确认于
2025/11/04 10:06
4 个月前
查看原帖
WA *1,submission
调红温了,所以写的比较乱。
CPP
#include <bits/stdc++.h>
using namespace std;

#ifdef SPN_LOCAL
#define debug(x) (cerr << "On Line " << __LINE__ << ": " << #x << " = " << x << endl)
#else
#define debug(x)
#endif

#define int long long
const int N = 6e6 + 5;

int n, m, a[N];
char c;

int v[15][N];

int dfs1(int d, int x) {
	if (d == 0) return v[d][x] = a[x];
	vector<int> vec = {dfs1(d - 1, 3 * x - 2), dfs1(d - 1, 3 * x - 1), dfs1(d - 1, 3 * x)};
	sort(vec.begin(), vec.end());
	if (vec[0] == 0 && vec[1] == 0) v[d][x] = 0;
	else v[d][x] = 1;
	return v[d][x];
}

int dfs(int d, int x, int s) {
	// 第d步,使a2[x]改变为s的最小步数
	if (d == 0) return a[x] != s;
	vector<int> vec = {dfs(d - 1, 3 * x - 2, v[d - 1][3 * x - 2] ^ 1), 
		dfs(d - 1, 3 * x - 1, v[d - 1][3 * x - 1] ^ 1), 
		dfs(d - 1, 3 * x, v[d - 1][3 * x] ^ 1)};
	sort(vec.begin(), vec.end());
	if (v[d - 1][3 * x - 2] == v[d - 1][3 * x - 1] && v[d - 1][3 * x - 1] == v[d - 1][3 * x]) {
		return vec[0] + vec[1];
	}
	return vec[0];
}

void _main() {
	cin >> n;
	m = pow(3, n);
	for (int i = 1; i <= m; i++) cin >> c, a[i] = c - '0';
	dfs1(n, 1);
//	for (int i = 0; i <= n; i++) {
//		for (int j = 1; j <= m; j++) cerr << v[i][j];
//		cerr << endl;
//	}
	cout << dfs(n, 1, v[n][1] ^ 1);
} signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr), cerr.tie(nullptr);
	
	int t = 1; for (/*cin >> t*/; t--; ) _main();
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...