CF1335E2 Three Blocks Palindrome (hard version)
题目链接:https://codeforces.com/contest/1335/problem/E2
题目的意思和之前简单版本的意思是一样的。
想法:
首先我们看到颜色的数目很少,所以我们可以考虑采取枚举颜色的方案
我们定义 sum[i][j] 代表前 j 个数里面颜色为 i 的个数 ,再定义一个 at[i][j] 代表第 j 个颜色为 i 的位置
然后我们的循环的第一层是 x 选择的颜色 ,第二层就是 可以选择多少个 x ,第三层就是 考虑 y 选择的颜色
稍微注意一下,这道题出题人卡空间了。
#pragma GCC optimize(3,"Ofast","inline")//O3优化 #pragma GCC optimize(2)//O2优化 #include <algorithm> #include <string> #include <cstring> #include <vector> #include <map> #include <stack> #include <set> #include <queue> #include <cmath> #include <cstdio> #include <iomanip> #include <ctime> #include <bitset> #include <cmath> #include <sstream> #include <iostream> #define LL long long #define ls nod<<1 #define rs (nod<<1)+1 #define pii pair<int,int> #define mp make_pair #define pb push_back #define INF 0x3f3f3f3f #define max(a,b) (a>b?a:b) #define min(a,b) (a<b?a:b) const double eps = 1e-10; const int maxn = 2e5 + 10; const int mod = 998244353; int sgn(double a){return a < -eps ? -1 : a < eps ? 0 : 1;} using namespace std; int a[maxn]; int main() { ios::sync_with_stdio(false); int t; cin >> t; while (t--) { int n; cin >> n; for (int i = 1;i <= n;i++) cin >> a[i]; vector<vector<int>> at(210); vector<vector<int>> sum(210, vector<int>(n + 1)); for (int i = 1;i <= 200;i++) { for (int j = 1;j <= n;j++) { sum[i][j] = sum[i][j-1] + (a[j] == i); if (a[j] == i) at[i].push_back(j); } } int Max = 0; for (int i = 1;i <= 200;i++) { Max = max(Max,sum[i][n]); // x 为 0 的情况 for (int j = 1;2 * j <= sum[i][n];j++) { int from = at[i][j-1]; int to = at[i][sum[i][n]-j]; for (int k = 1;k <= 200;k++) Max = max(Max,sum[i][from]+sum[k][to-1]-sum[k][from]+sum[i][n]-sum[i][to-1]); } } cout << Max << endl; } return 0; }