环鸽的CHONG

环鸽的CHONG

https://ac.nowcoder.com/acm/contest/5759/A

思路
如果在区间[l,r]之间有一个位置p,a[p]是唯一的,那么容易知道,左端点取[l,p-1],右端点取[p+1,r]都满足要求 即都是好序列,
那么只需要考虑两个区间是不是分别满足子区间都是好序列都可以。
所以处理出来离每个数字左右两端最近的位置,dfs即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<int,int> mp;
int a[1<<18],l[1<<18],r[1<<18];
bool dfs(int ll,int rr){
    if(ll>=rr) return 1;
    int i=ll,j=rr;
    while(i<=j){
        if(l[i]<ll && r[i]>rr) return dfs(ll,i-1)&&dfs(i+1,rr);
        if(l[j]<ll && r[j]>rr) return dfs(ll,j-1)&&dfs(j+1,rr);
        i++,j--;
    }
    return 0;
}
int main(){
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(!mp[a[i]]) l[i]=0;
        else l[i]=mp[a[i]];
        mp[a[i]]=i;
    }
    mp.clear();
    for(int i=n;i;i--){
        if(!mp[a[i]]) r[i]=1e9;
        else r[i]=mp[a[i]];
        mp[a[i]]=i;
    }
    int flag=dfs(1,n);
    puts(flag?"chong":"fuchong");
    return 0;
}
全部评论
时间复杂度,感觉过不了啊, 分治就 n * log(n)
点赞 回复 分享
发布于 2020-05-18 17:51

相关推荐

下个早班:秒挂就是不缺人
点赞 评论 收藏
分享
05-25 10:45
门头沟学院 Java
Frank_zhan...:没实习一个项目肯定不够,可以再做一个轮子,技术栈再补一个mq,微服务,整体再换个简历模板,暑期尽量再找一个日常实习
无实习如何秋招上岸
点赞 评论 收藏
分享
评论
5
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务