CF-div3-635-E - Three Blocks Palindrome| 二分

Posted fisherss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于CF-div3-635-E - Three Blocks Palindrome| 二分的主要内容,如果未能解决你的问题,请参考以下文章

CF-Div2-832 D. Yet Another Problem(bitmask&结论)

CF-Div2-832 D. Yet Another Problem(bitmask&结论)

CF-div3-611-F. DIY Garland 优先队列 构造树

CF-div2-620-D. Shortest and Longest LIS 贪心,双指针

CF-div2-620-E. 1-Trees and Queries LCA 树上点距离

AC日记——[POI2008]BLO-Blockade 洛谷 [POI2008]BLO-Blockade