题解 | 人人都是好朋友

人人都是好朋友

https://www.nowcoder.com/practice/431a2726d73e424896d3fd222c2c1621

并查集+离散化一下就行了,dsu随便写的,没按秩合并什么的,跑的1.6s,常数可能有点,离散化写的也有点丑陋了

struct DSU{
    int n;
    vector<int> f;
    void init(int _){
        n=_;
        f.resize(n+1);
        for(int i=1;i<=n;i++){
            f[i]=i;
        }
    }
    int find(int x){
        if(x==f[x])return x;
        else{
            return f[x]=find(f[x]);
        }
    }
    void merge(int x,int y){
        x=find(x);
        y=find(y);
        if(x==y)return ;
        f[x]=y;
        return ;
    }
    bool same(int x,int y){
        return find(x)==find(y);
    }
};
int p(int x,vector<int> &v){
    int L=0,R=v.size(),pos=-1;
    while(L<=R){
        int mid=(L+R)>>1;
        if(v[mid]<=x){
            pos=mid;
            L=mid+1;
        }else{
            R=mid-1;
        }
    }return pos;
}
void solve(){
    int n;
    cin>>n;
    vector<pair<int,int>>q,r;
    vector<int> k;
    for(int i=1;i<=n;i++){
        int a,b,c;
        cin>>a>>b>>c;
        if(c!=1){
            q.push_back({a,b});
        }else{
            r.push_back({a,b});
        }
        k.push_back(a);
        k.push_back(b);
    }
    sort(k.begin(),k.end());
    k.erase(unique(k.begin(),k.end()),k.end());
    unordered_map<int,int>f;
    DSU d;
    d.init(k.size()+1);
    for(int i=0;i<r.size();i++){
        int u,v;
        if(f.find(r[i].first)==f.end()){
            f[r[i].first]=p(r[i].first,k);
        }
        u=f[r[i].first];
        if(f.find(r[i].second)==f.end()){
            f[r[i].second]=p(r[i].second,k);
        }
        v=f[r[i].second];
        d.merge(u,v);
    }
    for(int i=0;i<q.size();i++){
        int u,v;
        if(f.find(q[i].first)==f.end()){
            f[q[i].first]=p(q[i].first,k);
        }
        u=f[q[i].first];
        if(f.find(q[i].second)==f.end()){
            f[q[i].second]=p(q[i].second,k);
        }
        v=f[q[i].second];
        if(d.same(u,v)){
            cout<<"NO"<<'\n';
            return ;
        }
    }cout<<"YES"<<'\n';
}   

全部评论

相关推荐

今天周一休息,突发奇想写一篇阶段总结。如题,我已经去了一个和Java彻底毫无关联的行业。曾经我以为自己能在计算机行业发光发热,没想到刚入行一年多就当了逃兵。从最开始的热爱到现在一看到代码就厌恶,不知道自己经历了什么。所以我去干什么了?答案是:在成都当了租房销售。上班那会压力大了就念叨着去干租房中介,但是一直下不去这个决心,想着自己学了四年多的计算机知识,终究还是不甘心。终于在某一天准备八股文的时候,看着无数篇和工作内容关系不大的理论知识,那一刻下定决心,决定尝试一下销售行业,也算是给自己一个交代。后面阴差阳错的投了成都自如去当租房管家,没想到面试很顺利,在当天一百多个面试的人里面,我成为了为数不多通过的几个幸运儿之一。目前已经培训通过,正式入职,也开了单,也有压力但是每天过得很开心,真心喜欢那种和人交流的感觉,哪怕是最后没有选择找我租房。说这些也是想告诉那些大三,大四正在找Java实习而焦虑的同学:你们现在还年轻,选择很多,容错率也很高,可以尽情去尝试自己喜欢的行业和工作。不用因为某一次的面试没通过或者简历石沉大海而焦虑,更不用因为身边人都在挤编程的独木桥就强迫自己跟风。也算是自己的碎碎念吧,也希望自己能在新的领域取得一点小成就。也祝牛油工作顺利!
沉淀小子:干啥都不丢人啊,生存是必须要的,销售很考验一个人综合素质能力的,好的销售人脉和资源可不比写字楼的白领差啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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