比赛爆零求调
查看原帖
比赛爆零求调
1439183
Burning_Red楼主2024/12/9 12:20

luogu85ptsRE了,但比赛爆零

#include <iostream>
#include <cstdio>
using namespace std;

typedef long long ll;

const ll INF = 1e5 + 10;

ll s1[INF], s2[INF], op1[INF], op2[INF];

struct node{
	int l, r, cnt1, cnt0;
} A[INF], B[INF];


int main() {
//	freopen("P11361_7.in", "r", stdin);
//	freopen("edit.out", "w", stdout);
	ll wobaozhengzhegebianliangmingyongbudao;
	cin >> wobaozhengzhegebianliangmingyongbudao;
	int n, t, c1, c0, ans, l, r, sum1, sum2, t1;
	string oo; 
	while (wobaozhengzhegebianliangmingyongbudao--) {
		scanf("%d", &n);
		c1 = c0 = ans = sum1 = sum2 = 0;
		t = l = r = t1 = 0; 
		cin >> oo;
		for (int i = 1; i <= n; i++) {
			s1[i] = oo[i - 1] - '0';
		}
		cin >> oo;
		for (int i = 1; i <= n; i++) {
			s2[i] = oo[i - 1] - '0';
		}
		l = 1;
		cin >> oo;
		op1[0] = 0; 
		for (int i = 1; i <= n; i++) {
			t = oo[i - 1] - '0';
			if (t == 0) {
				op1[0]++;
				op1[op1[0]] = i;
				if (i > l) {
					sum1++;
					A[sum1].l = l;
					A[sum1].r = i - 1;
					A[sum1].cnt0 = c0;
					A[sum1].cnt1 = c1;
				}
				c0 = 0;
				c1 = 0;
				l = i + 1;
			} else {
				if (s1[i] == 1) {
					c1++;
				} else {
					c0++;
				}
			}
		}
		if (l != n + 1) {
			sum1++;
			A[sum1].l = l;
			A[sum1].r = n;
			A[sum1].cnt0 = c0;
			A[sum1].cnt1 = c1;
			
		}
		l = 1;
		c0 = 0;
		c1 = 0;
		cin >> oo;
		op2[0] = 0; 
		for (int i = 1; i <= n; i++) {
			t = oo[i - 1] - '0';
			if (t == 0) {
				op2[0]++;
				op2[op2[0]] = i;
				if (i > l) {
					sum2++;
					B[sum2].l = l;
					B[sum2].r = i - 1;
					B[sum2].cnt0 = c0;
					B[sum2].cnt1 = c1;
				}
				c0 = 0;
				c1 = 0;
				l = i + 1;
			} else {
				if (s2[i] == 1) {
					c1++;
				} else {
					c0++;
				}
			}
		}
		if (l != n + 1) {
			sum2++;
			B[sum2].l = l;
			B[sum2].r = n;
			B[sum2].cnt0 = c0;
			B[sum2].cnt1 = c1;
			
		}
		l = r = 1;
//		cout << B[2].cnt0 << endl;
		for (int i = 1; i <= op1[0]; i++) {
			while (B[l].r < op1[i]) {
				l++;
			}
			while (op2[r] < op1[i]) {
				r++;
			}
			if (r <= op2[0] && op1[i] == op2[r]) {
				if (s1[op1[i]] == s2[op2[r]]) {
					ans++;
				}
			} else if (l <= sum2 && B[l].l <= op1[i]) {
				if (s1[op1[i]] == 1) {
					if (B[l].cnt1 > 0) {
						ans++;
						B[l].cnt1--;
					}
				} else {
					if (B[l].cnt0 > 0) {
						ans++;
						B[l].cnt0--;
					}
				}
			}
		}
//		cout << B[2].cnt0 << endl;
		l = r = 1;
		for (int i = 1; i <= op2[0]; i++) {
			while (A[l].r < op2[i]) {
				l++;
			}
			if (A[l].l <= op2[i] && l <= sum1) {
				if (s2[op2[i]] == 1) {
					if (A[l].cnt1 > 0) {
						ans++;
						A[l].cnt1--;
					}
				} else {
					if (A[l].cnt0 > 0) {
						ans++;
						A[l].cnt0--;
					}
				}
			}
		}
		int i;
		l = 1, i = 1;
		while (1) {
			while ((A[i].r < B[l].l || B[l].r < A[i].l) && l <= sum2 && i <= sum1) {
				if (A[i].r < B[l].l) {
					i++;
				} else {
					l++;
				}
			}
			if (i == sum1 + 1) {
				break;
			}
			if (l == sum2 + 1) {
				break;
			}
				t = min(A[i].r, B[l].r) - max(A[i].l, B[l].l) + 1;
//				cout << t << endl;
				if (min(A[i].cnt1, B[l].cnt1) < t) {
					ans += min(A[i].cnt1, B[l].cnt1);
					t1 = A[i].cnt1 - min(A[i].cnt1, B[l].cnt1);
					t -= min(A[i].cnt1, B[l].cnt1);
					B[l].cnt1 -= min(A[i].cnt1, B[l].cnt1);
					A[i].cnt1 = t1;
				} else {
//					cout << ans << ' ';
					A[i].cnt1 -= t;
					B[l].cnt1 -= t;
//					cout << t << ' ';
					ans += t;
//					cout << ans << endl;
					t = 0;
				}
//				cout << t << endl;
				if (min(A[i].cnt0, B[l].cnt0) < t) {
//					cout << '*' << endl;
//					cout << A[i].cnt0 << ' ' << B[i].cnt0 << endl;
					ans += min(A[i].cnt0, B[l].cnt0);
					t1 = A[i].cnt0 - min(A[i].cnt0, B[l].cnt0);
					t -= min(A[i].cnt0, B[l].cnt0);
					B[l].cnt0 -= min(A[i].cnt0, B[l].cnt0);
					A[i].cnt0 = t1;
				} else {
//					cout << ans << ' ';
					A[i].cnt0 -= t;
					B[l].cnt0 -= t;
					ans += t;
//					cout << ans << endl;
					t = 0;
				}
			if (A[i].r > B[l].r) {
				l++;
			} else {
				i++;
			}
		}
		printf("%d\n", ans);
	}
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}

/*
1
9
101111111
100111000
110111011
011111111

1
6
011101
111010
111010
10110
*/
2024/12/9 12:20
加载中...