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;
}

猜你喜欢

转载自www.cnblogs.com/fisherss/p/12705428.html