環鴿的CHONG

題目鏈接:環鴿的CHONG


比賽的時候用莫隊瞎搞過了,但不是正解。

這道題顯然我們可以想到每次分治唯一的元素。但是如果在特殊情況,每次從左往後或者從右往左都可能會達到O(n^2)的複雜度,考慮優化,我們可以隨機去找

如果我們預處理每個數字前面相同數字的位置和後面相同的位置,我們就可以發現,如果我們從兩邊同時往中間找,複雜度最差的時候就是在中間找到,所以複雜度就變爲:O(nlogn)了。


AC代碼:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=2e5+10;
int n,a[N],l[N],r[N]; map<int,int> mp;
int dfs(int L,int R){
	if(L>=R)	return 1;
	int x=L,y=R,pos=-1;
	while(x<=y){
		if(l[x]<L&&r[x]>R){pos=x;	break;}
		if(l[y]<L&&r[y]>R){pos=y;	break;}
		x++,y--;
	}
	if(pos==-1)	return 0;
	return dfs(L,pos-1)&&dfs(pos+1,R);
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++)	scanf("%d",&a[i]),l[i]=mp[a[i]],mp[a[i]]=i;	mp.clear();
	for(int i=n;i>=1;i--)	r[i]=mp[a[i]]?mp[a[i]]:n+1,mp[a[i]]=i;
	puts(dfs(1,n)?"chong":"fuchong");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章