MLE求助
查看原帖
MLE求助
846303
Stdinout楼主2024/3/9 14:24
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 5;
int dp1[maxn][3];//1 : red, 2 : green, 3 : blue
int dp2[maxn][3];//1 : red, 2 : green, 3 : blue
vector<int> G[maxn];
int tot = 1;
int cnt = 0;
int read(int now, int t, string s){
	if(s[t] == '0') return now;
    if(s[t] == '1') {
        G[now].push_back(read(++tot, ++cnt, s));
        return now;
    }
    if(s[t] == '2'){
        G[now].push_back(read(++tot, ++cnt, s));
        G[now].push_back(read(++tot, ++cnt, s));
        return now;
    }
}
void dfs1(int u, int fa){
	dp1[u][0] = 0;
	dp1[u][1] = 1;
	dp1[u][2] = 0;
	dp2[u][0] = 0;
	dp2[u][1] = 1;
	dp2[u][2] = 0;
	if(G[u].size() == 0) return;
	else if(G[u].size() == 1){
		int v = G[u][0];
		dfs1(v, u);
		dp1[u][1] += max(dp1[v][0], dp1[v][2]);
		dp1[u][2] += max(dp1[v][1], dp1[v][0]);
		dp1[u][0] += max(dp1[v][1], dp1[v][2]);
		dp2[u][1] += min(dp2[v][0], dp2[v][2]);
		dp2[u][2] += min(dp2[v][1], dp2[v][0]);
		dp2[u][0] += min(dp2[v][1], dp2[v][2]);
	}
	else{
		int v1 = G[u][0], v2 = G[u][1];
		dfs1(v1, u);
		dfs1(v2, u);
		dp1[u][1] += max(dp1[v1][0] + dp1[v2][2], dp1[v1][2] + dp1[v2][0]);
		dp1[u][2] += max(dp1[v1][1] + dp1[v2][0], dp1[v1][0] + dp1[v2][1]);
		dp1[u][0] += max(dp1[v1][1] + dp1[v2][2], dp1[v1][2] + dp1[v2][1]);
		dp2[u][1] += min(dp2[v1][0] + dp2[v2][2], dp2[v1][2] + dp2[v2][0]);
		dp2[u][2] += min(dp2[v1][1] + dp2[v2][0], dp2[v1][0] + dp2[v2][1]);
		dp2[u][0] += min(dp2[v1][1] + dp2[v2][2], dp2[v1][2] + dp2[v2][1]);
	}
}
int main(){
	// freopen("3color.in", "r", stdin);
	// freopen("3color.out", "w", stdout);
    string s;
    cin >> s;
    read(1, 0, s);
    dfs1(1, 0);
    cout << max({dp1[1][0], dp1[1][1], dp1[1][2]}) << " " << min({dp2[1][1], dp2[1][0], dp2[1][2]});
    return 0;
}

MLE 2 个点

2024/3/9 14:24
加载中...