把两个错解拼起来就对了
查看原帖
把两个错解拼起来就对了
722313
Whiking楼主2024/10/21 11:28

把两个错的拼起来去最大值就对了

#include <bits/stdc++.h>

void Freopen() {
    freopen("", "r", stdin);
    freopen("", "w", stdout);
}

using namespace std;
const int N = 2e6 + 10, M = 2e5 + 10, inf = 1e9, mod = 998244353;

int n, m;

int col[N][3];

struct node {
	int f, g;
	
	node operator + ( const node rhs) const {
		return {f + rhs.f, g + rhs.g};
	}
} dp[N][3];

node mg( node a, node b) {
	if (a.f > b.f) return a;
	if (a.f < b.f) return b;
	
	return a.g > b.g ? a : b;
}

char s[N];

void solve() {
	cin >> n >> m;
			
	cin >> (s + 1);
	
	for ( int i = 1; i <= n; i ++)
		col[i][1] = s[i] - '0';
	
	cin >> (s + 1);
		
	for ( int i = 1; i <= n; i ++)
		col[i][2] = s[i] - '0';
	
		
	for ( int i = 1; i <= n; i ++) {
		if (col[i][1] == 1 && col[i][2] == 1) {
			dp[i][0] = dp[i][1] = {1, 0}, dp[i][2] = {2, 0};
			
			dp[i][0] = mg(dp[i][0], mg(dp[i - 1][0] + dp[i][0], dp[i - 1][2] + dp[i][0]));
			dp[i][1] = mg(dp[i][1], mg(dp[i - 1][1] + dp[i][1], dp[i - 1][2] + dp[i][1]));
			dp[i][2] = mg(dp[i][2], mg(dp[i - 1][0] + dp[i][2], mg(dp[i - 1][1] + dp[i][2], dp[i - 1][2] + dp[i][2])));
		} else if (col[i][1]) {
			dp[i][0] = {1, 1}, dp[i][1] = {-1, 0}, dp[i][2] = {0, 0};
			
			dp[i][0] = mg(dp[i][0], mg(dp[i - 1][0] + (dp[i - 1][0].g < m ? dp[i][0] : (node){1, 1}), dp[i - 1][2] + (dp[i - 1][2].g < m ? dp[i][0] : (node){1, 1})));
			dp[i][1] = mg(dp[i][1], mg(dp[i - 1][1] + dp[i][1], dp[i - 1][2] + dp[i][1]));
			dp[i][2] = mg(dp[i][2], mg(dp[i - 1][0] + dp[i][2], mg(dp[i - 1][1] + dp[i][2], dp[i - 1][2] + dp[i][2])));
		} else if (col[i][2]) {
			dp[i][0] = {-1, 0}, dp[i][1] = {1, 1}, dp[i][2] = {0, 0};
			
			dp[i][0] = mg(dp[i][0], mg(dp[i - 1][0] + dp[i][0], dp[i - 1][2] + dp[i][0]));
			dp[i][1] = mg(dp[i][1], mg(dp[i - 1][1] + (dp[i - 1][1].g < m ? dp[i][1] : (node){1, 1}), dp[i - 1][2] + (dp[i - 1][2].g < m ? dp[i][1] : (node){1, 1})));
			dp[i][2] = mg(dp[i][2], mg(dp[i - 1][0] + dp[i][2], mg(dp[i - 1][1] + dp[i][2], dp[i - 1][2] + dp[i][2])));
		} else {
			dp[i][0] = dp[i][1] = {-1, 0}, dp[i][2] = {-2, 0};	
			
			dp[i][0] = mg(dp[i][0], mg(dp[i - 1][0] + dp[i][0], dp[i - 1][2] + dp[i][0]));
			dp[i][1] = mg(dp[i][1], mg(dp[i - 1][1] + dp[i][1], dp[i - 1][2] + dp[i][1]));
			dp[i][2] = mg(dp[i][2], mg(dp[i - 1][0] + dp[i][2], mg(dp[i - 1][1] + dp[i][2], dp[i - 1][2] + dp[i][2])));
		}
	}
	
	int ans = 0;
	
	for ( int i = 1; i <= n; i ++)
		ans = max(ans, max(dp[i][0].f - min(m, dp[i][0].g) * 2, max(dp[i][1].f - min(m, dp[i][1].g) * 2, dp[i][2].f - min(m, dp[i][2].g) * 2)));
		
	for ( int i = 1; i <= n; i ++) {
		if (col[i][1] == 1 && col[i][2] == 1) {
			dp[i][0] = dp[i][1] = {1, 0}, dp[i][2] = {2, 0};
			
			dp[i][0] = mg(dp[i][0], mg(dp[i - 1][0] + dp[i][0], dp[i - 1][2] + dp[i][0]));
			dp[i][1] = mg(dp[i][1], mg(dp[i - 1][1] + dp[i][1], dp[i - 1][2] + dp[i][1]));
			dp[i][2] = mg(dp[i][2], mg(dp[i - 1][0] + dp[i][2], mg(dp[i - 1][1] + dp[i][2], dp[i - 1][2] + dp[i][2])));
		} else if (col[i][1]) {
			dp[i][0] = {-1, 1}, dp[i][1] = {-1, 0}, dp[i][2] = {0, 0};
			
			dp[i][0] = mg(dp[i][0], mg(dp[i - 1][0] + (dp[i - 1][0].g < m ? dp[i][0] : (node){1, 1}), dp[i - 1][2] + (dp[i - 1][2].g < m ? dp[i][0] : (node){1, 1})));
			dp[i][1] = mg(dp[i][1], mg(dp[i - 1][1] + dp[i][1], dp[i - 1][2] + dp[i][1]));
			dp[i][2] = mg(dp[i][2], mg(dp[i - 1][0] + dp[i][2], mg(dp[i - 1][1] + dp[i][2], dp[i - 1][2] + dp[i][2])));
		} else if (col[i][2]) {
			dp[i][0] = {-1, 0}, dp[i][1] = {-1, 1}, dp[i][2] = {0, 0};
			
			dp[i][0] = mg(dp[i][0], mg(dp[i - 1][0] + dp[i][0], dp[i - 1][2] + dp[i][0]));
			dp[i][1] = mg(dp[i][1], mg(dp[i - 1][1] + (dp[i - 1][1].g < m ? dp[i][1] : (node){1, 1}), dp[i - 1][2] + (dp[i - 1][2].g < m ? dp[i][1] : (node){1, 1})));
			dp[i][2] = mg(dp[i][2], mg(dp[i - 1][0] + dp[i][2], mg(dp[i - 1][1] + dp[i][2], dp[i - 1][2] + dp[i][2])));
		} else {
			dp[i][0] = dp[i][1] = {-1, 0}, dp[i][2] = {-2, 0};	
			
			dp[i][0] = mg(dp[i][0], mg(dp[i - 1][0] + dp[i][0], dp[i - 1][2] + dp[i][0]));
			dp[i][1] = mg(dp[i][1], mg(dp[i - 1][1] + dp[i][1], dp[i - 1][2] + dp[i][1]));
			dp[i][2] = mg(dp[i][2], mg(dp[i - 1][0] + dp[i][2], mg(dp[i - 1][1] + dp[i][2], dp[i - 1][2] + dp[i][2])));
		}
	}
	
	for ( int i = 1; i <= n; i ++)
		ans = max(ans, max(dp[i][0].f, max(dp[i][1].f, dp[i][2].f)));

	cout << ans << '\n';
}

signed main() {
	ios :: sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	
	int c, t;
	
	for (cin >> c >> t; t; t --) solve();
}


2024/10/21 11:28
加载中...