pts80分求助
查看原帖
pts80分求助
1050426
lxy_qwq楼主2025/7/20 13:02
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
int n;
int a[MAXN];
int vis[MAXN];
bool check(int mid) {

	int result = 0;
	for (int i = 1; i < MAXN; i++) {
		vis[i] = 0;
	}
	for (int i = 1; i <= n; i++) {
		vis[a[i]]++;
		if (vis[a[i]] == 2) {
			result++;
		}
	}
	
	//删除区间
	for (int i = 1; i <= mid; i++) {
		vis[a[i]]--;
		if (vis[a[i]] == 1) {
			result--;
		}
	}
	if (result == 0) {
		return 1;
	}

	for (int i = 1; i + mid <= n; i++) {
		//留下i, 删除i+mid
		vis[a[i]]++;
		if (vis[a[i]] == 2) {
			result++;
		}

		vis[a[i + mid]]--;
		if (vis[a[i + mid]] == 1) {
			result--;
		}

		if (!result) {
			return 1;
		}
	}

	return 0;
}
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}

	//二分删除的区间
	int left = 1, right = n;
	int result;
	while (left <= right) {
		int mid = (left + right) / 2;
		if (check(mid)) {
			result = mid;
			right = mid - 1;
		}
		else {
			left = mid + 1;
		}
	}

	cout << n - result << endl;
	return 0;
}
2025/7/20 13:02
加载中...