50分求条
查看原帖
50分求条
681755
CuteGirlGC楼主2024/6/9 10:48
#include <iostream>
#include <vector>

using namespace std;

const int kMaxN = 5e5 + 1;

int c = 1, n, f[2][kMaxN][2];
string s;
vector<int> g[kMaxN];

void Build() {
	int now = c;
	char i;
	cin >> i, n++;
	if (i == '0') {
		return;
	}
	if (i == '1') {
		g[now].push_back(++c);
		Build();
	} else {
		g[now].push_back(++c);
		Build();
		g[now].push_back(++c);
		Build();
	}
}

void dfs(int x) {
	for (int i : g[x]) {
		dfs(i);
	}
	if (!g[x].size()) {
		f[0][x][0] = 0, f[0][x][1] = 1;
		f[1][x][1] = 1, f[1][x][0] = 0;
	} else if (g[x].size() == 1) {
		f[0][x][0] = max(f[0][g[x][0]][1], f[0][g[x][0]][0]);
		f[0][x][1] = f[0][g[x][0]][0] + 1;
		f[1][x][0] = min(f[1][g[x][0]][0], f[1][g[x][0]][1]);
		f[1][x][1] = f[0][g[x][0]][0] + 1;
	} else {
		f[0][x][1] = f[0][g[x][0]][0] + f[0][g[x][1]][0] + 1;
		f[1][x][1] = f[1][g[x][0]][0] + f[1][g[x][1]][0] + 1;
		f[0][x][0] = max(f[0][g[x][0]][0] + f[0][g[x][1]][1], f[0][g[x][0]][1] + f[0][g[x][1]][0]);
		f[1][x][0] = min(f[1][g[x][0]][0] + f[1][g[x][1]][1], f[1][g[x][0]][1] + f[1][g[x][1]][0]);
	}
}

int main() {
	Build();
	dfs(1);
	cout << max(f[0][1][0], f[0][1][1]) << ' ' << min(f[1][1][0], f[1][1][1]);
	return 0;
}
2024/6/9 10:48
加载中...