代码打印

2025-cpc-24 2025-05-18 17:13:36

#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<unordered_map>
#include<set>
#include<queue>
#include<unordered_set>
#include<cmath>
#include<cstring>
#include<stack>
#include<algorithm>
#define ll long long
using namespace std;
const int N = 1e5 + 5;
int num[502], temp[502];
int dp[502], dpp[520];
vector<int>cnt[502];
map<int, int>pos;
int n, tol;
int find1(int o) {
	//int temp = o+1;
	int pp = num[o];
	int p = pos[pp];
	int cpos = 0;
	for(int i=0;i<cnt[p].size();i++)
		if (cnt[p][i] > o) {
			cpos = cnt[p][i];
			break;
		}
	if (cpos == 0)return n+2;
	int finalpos = n+2;
	for (int i = 0;i < tol;i++) {
		int mincnt = 0;
		for (int j = 0;j < cnt[i].size();j++) {
			if (cnt[i][j] > cpos)mincnt++;
			if (mincnt == 2) {
				finalpos = min(finalpos, cnt[i][j]);
				break;
			}
		}
	}
	return finalpos;
}
int find2(int o) {
	int finalpos = n + 2;
	int p = pos[num[o]];
	for (int i = 0;i < tol;i++) {
		int smallpos = n+2;
		bool flag = 1;
		for (int j = 0;j < cnt[i].size();j++) {
			if (cnt[i][j] > o) {
				smallpos = cnt[i][j];
				flag = 0;
				break;
			}
		}
		if (flag)continue;
		flag = 1;
		for (int j = 0;j < cnt[p].size();j++) {
			if (cnt[p][j] > smallpos) {
				smallpos = cnt[p][j];
				flag = 0;
				break;
			}
		}
		if (flag)continue;
		flag = 1;
		for (int j = 0;j < cnt[i].size();j++) {
			if (cnt[i][j] > smallpos) {
				smallpos = cnt[i][j];
				flag = 0;
				break;
			}
		}
		if (flag)continue;
		flag = 1;
		finalpos = min(smallpos, finalpos);
	}
	return finalpos;
}
int find3(int o) {
	int finalpos = n + 2;
	int p = pos[num[o]];
	for (int i = 0;i < tol;i++) {
		int smallpos = n + 2;
		bool flag = 1;
		for (int j = 0;j < cnt[i].size();j++) {
			if (cnt[i][j] > o) {
				smallpos = cnt[i][j];
				flag = 0;
				break;
			}
		}
		if (flag)continue;
		flag = 1;
		for (int j = 0;j < cnt[i].size();j++) {
			if (cnt[i][j] > smallpos) {
				smallpos = cnt[i][j];
				flag = 0;
				break;
			}
		}
		if (flag)continue;
		flag = 1;
		for (int j = 0;j < cnt[p].size();j++) {
			if (cnt[p][j] > smallpos) {
				smallpos = cnt[p][j];
				flag = 0;
				break;
			}
		}
		if (flag)continue;
		flag = 1;
		finalpos = min(smallpos, finalpos);
	}
	return finalpos;
}
int main() {
	int t = 1;
	cin >> t;
	while (t--) {
		cin >> n;
		for (int i = 1;i <= n;i++) {
			cin >> num[i];
			temp[i] = num[i];
		}
		sort(temp + 1, temp + 1 + n);
		tol = unique(temp + 1, temp + 1 + n) - temp - 1;
		for (int i = 1;i <= n;i++) {
			pos[num[i]] = lower_bound(temp + 1, temp + 1 + tol, num[i]) - temp - 1;//新的id
			cnt[pos[num[i]]].push_back(i);
		}
		for (int i = 1;i <= n;i++)dp[i] = n + 3;
		for (int i = 1;i <= n;i++) {
			dp[i] = min(dp[i], find1(i));
			dp[i] = min(dp[i], find2(i));
			dp[i] = min(dp[i], find3(i));
		}
		for (int i = 1;i <= n;i++) {
			dpp[dp[i]] = max(dpp[dp[i]], dpp[i - 1] + 1);
		}
		int mn = 0;
		for (int i = 1;i <= n;i++) {
			mn = max(mn, dpp[i]);
		}
		cout << mn << '\n';
	}
}
/*
7
1 1 1 1 1 1 1
3
1 1 1
8
1 1 2 2 1 1 2 2
9
1 4 1 2 2 1 1 2 2
8
1 3 1 3 1 3 3 1
8
1 2 2 1 2 1 2 3
4
3 3 3 3
10
1 2 1 2 1 2 1 2 1 2
8
1 1 1 1 1 1 1 1
*/

共 1 条回复

2025-cpc-root

1