代码打印
2025-cpc-24
2025-05-18 16:52:57
#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;
for (int j = 0;j < cnt[p].size();j++) {
if (cnt[p][j] > smallpos) {
smallpos = cnt[p][j];
flag = 0;
break;
}
}
if (flag)continue;
for (int j = 0;j < cnt[i].size();j++) {
if (cnt[i][j] > smallpos) {
smallpos = cnt[i][j];
flag = 0;
break;
}
}
if (flag)continue;
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;
for (int j = 0;j < cnt[i].size();j++) {
if (cnt[i][j] > smallpos) {
smallpos = cnt[i][j];
flag = 0;
break;
}
}
if (flag)continue;
for (int j = 0;j < cnt[p].size();j++) {
if (cnt[p][j] > smallpos) {
smallpos = cnt[p][j];
flag = 0;
break;
}
}
if (flag)continue;
finalpos = min(smallpos, finalpos);
}
return finalpos;
}
int main() {
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] = 1e8;
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]+1] = max(dpp[dp[i]+1], dpp[i] + 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
*/
共 1 条回复
1