倒着并查集但是TLE了,该怎么优化%%
查看原帖
倒着并查集但是TLE了,该怎么优化%%
1416590
nob_lz楼主2025/1/20 21:11
#include<bits/stdc++.h>

using namespace std;
using i64=long long;
using u64=unsigned long long;

constexpr int N=4e5+5;
vector<int> dey(N);  
vector<int> edge[N],v;

struct DSU{
    vector<int> f,siz;
    DSU(){};
    DSU(int n){
        inite(n);
    };
    void inite(int n){
        f.resize(n);
        iota(f.begin(),f.end(),0);
        siz.assign(n,1);
    }
    int find(int x){
        while(f[x]!=x){
            x=f[x]=f[f[x]];
        }
        return x;
    }
    bool merge(int x,int y){
        x=find(x),y=find(y);
        if(x==y) return false;
        else{
            f[y]=x;
            siz[x]+=siz[y];
            return true;
        }
    }
    bool same(int x,int y){
        return (find(x)==find(y));
    }
    void erase(int x){
        siz[find(x)]--;
        f[x]=x;
    }
};

void solve(){
    int n,m,k;
    cin>>n>>m;
    DSU g(n);
  
    for(int i=1;i<=m;++i){
        int u,v;
        cin>>u>>v;
        edge[u].push_back(v);
        edge[v].push_back(u);
    }
    cin>>k;
    vector<int> p(k+1);
    for(int i=1;i<=k;++i){
        cin>>p[i];  
        dey[p[i]]=1;
    }
    for(int i=0;i<n;++i){
        if(dey[i]) continue;
        for(auto p:edge[i]){
            if(!dey[p] && !dey[i] && !g.same(p,i))
                g.merge(i,p);
        }
    }
    int ans=0;
    for(int i=k;i>=1;--i){
        for(int j=0;j<n;++j){
            if(!dey[j] && g.f[j]==j) ans++;
        }   
        v.push_back(ans);       
        ans=0;
        dey[p[i]]=0;
        for(auto x:edge[p[i]]){
            if(!dey[x] && !g.same(p[i],x))
                g.merge(p[i],x);
        }
    }
    for(int i=0;i<n;++i){
        if(g.f[i]==i) ans++;
    }
    v.push_back(ans);
    for(int i=v.size()-1;i>=0;--i){
        cout<<v[i]<<'\n';
    }
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    solve();
    return 0;
}

只有40pts其余均是TLE,实在不知道该怎么优化了,还是说做法有问题。。。

2025/1/20 21:11
加载中...