CF-div3-635-E - Three Blocks Palindrome| 二分
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+100;
int a[maxn];
int n;
int main(){
int t;
cin>>t;
while(t--){
cin>>n;
vector<int> v[300];
int ans = 0;
for(int i = 1;i<=n;i++) {
cin>>a[i];
v[a[i]].push_back(i);
}
for(int i = 1;i<=200;i++){ //枚举a
int siz = v[i].size();
ans = max(ans,siz);
for(int j = 0;j<siz/2;j++){ //枚举左边多少个a 对应右边也有这么多a
int l = v[i][j]; //j:左边a结束的下标 端点的值l(左边最后) v[i][j]就是结束位置 j+1就是左边a的个数
int r = v[i][siz-1-j]; //右端点a开始 (右边最前) siz-1-j (因为左右个数同,这里直接算出右边a开始的位置siz-1-j)
for(int k = 1;k<=200;k++){ //枚举b 是哪个数
if(k == i) continue;
//l位置之后
int cnt1 = upper_bound(v[k].begin(),v[k].end(),l) - v[k].begin();
//r位置之前
int cnt2 = upper_bound(v[k].begin(),v[k].end(),r) - v[k].begin();
//l~r之间为k的个数 cnt2-cnt1 再加上 左边a的个数j+1 对应右边a的个数j+1
ans = max(cnt2-cnt1+(j+1)+(j+1),ans);
}
}
}
cout<<ans<<endl;
}
return 0;
}