社区讨论

C求调!

学术版参与者 6已保存回复 7

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@mjocwh1s
此快照首次捕获于
2025/12/27 21:48
2 个月前
此快照最后确认于
2025/12/30 20:50
2 个月前
查看原帖
rt,心态崩了,没看 DD
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 200005;
int n, sz, ans, a[N];
bool b[N];
vector<int> c;
bool check(int x, int y, int z, int r) {
	if (a[x] == a[y] && a[x] == a[z] && a[x] == a[r])
		return 1;
	return 0;
}
int main() {
	scanf("%d", &n);
	ans = n;
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	for (int i = 1; i <= n - 3; i++)
		if (!b[i] && check(i, i + 1, i + 2, i + 3))
			c.push_back(i), b[i] = b[i + 1] = b[i + 2] = b[i + 3] = 1;
	sz = c.size();
	for (int i = 0; i < sz; i++) {
		int l = c[i] - 1, r = c[i] + 4, x, y, cnt = 4;
		if (!i)
			x = 0;
		else
			x = c[i - 1] + 3;
		for (; l > x && r <= n; --l, ++r) {
			bool f = 1;
			if (r + 2 <= n && check(l, r, r + 1, r + 2) && f)
				--l, r += 3, f = 0;
			if (l - 1 > x && r + 1 <= n && check(l - 1, l, r, r + 1) && f)
				l -= 2, r += 2, f = 0;
			if (l - 2 > x && check(l - 2, l - 1, l, r) && f)
				l -= 3, ++r, f = 0;
			if (l - 3 > x && check(l - 3, l - 2, l - 1, l) && f)
				l -= 4, f = 0;
			if (r + 3 <= n && check(r + 0, r + 1, r + 2, r + 3) && f)
				r += 4, f = 0;
			if (f)
				break;
			cnt += 4;
		}
		ans -= cnt;
		c[i] = r;
	}
	printf("%d\n", max(0, ans));
}

回复

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

正在加载回复...