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;
}
原文地址:https://www.cnblogs.com/-Ackerman/p/12929081.html