环鸽的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

相关推荐

程序员小白条:你是沟通了900个,不是投了900份简历,你能投900份,意味着对面都要回复你900次,你早就找到实习了,没亮点就是这样的,别局限地区,时间投的也要早,现在都要7月了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-25 19:15
点赞 评论 收藏
分享
评论
5
1
分享

创作者周榜

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