題目鏈接:環鴿的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;
}