MnZn在线求助冰茶寄

P6121 [USACO16OPEN] Closing the Farm G

LJN1117 @ 2024-10-22 21:04:58

WA on 2,3,4,5,6,7,8,9,10

已调0.5h,请求支援

#include<bits/stdc++.h>
#define int long long
#define maxn 200100

using namespace std;

int n,m;
int used[maxn],q[maxn],fa[maxn],ans[maxn];
int head[maxn],nxt[maxn<<1],to[maxn<<1],tot;

void add(int x,int y){
    nxt[++tot]=head[x];
    head[x]=tot;
    to[tot]=y;
}

int find(int x){
    if(fa[x]==x) return x;
    return fa[x]=find(fa[x]);
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=m;i++){
        int u,v;cin>>u>>v;
        add(u,v),add(v,u);
    }
    for(int i=1;i<=n;i++) cin>>q[i];
    int sum=0;
    for(int i=n;i>=1;i--){
        sum++;
        used[q[i]]=1;
        for(int j=head[q[i]];j;j=nxt[j]){
            int y=to[j];
            if(find(q[i])!=find(y)) fa[find(y)]=find(q[i]);
            if(used[y]) sum--;
        }
        if(sum==1) ans[i]=1;
    }
    for(int i=1;i<=n;i++){
        if(ans[i]==1) cout<<"YES\n";
        else cout<<"NO\n";
    }
    return 0;
}

by LG086 @ 2024-10-22 21:41:05

@LJN1117 死因:应该把 if(find(q[i])!=find(y)) fa[find(y)]=find(q[i]);f(used[y]) sum--; 合并在一起用,即 if(find(q[i])!=find(y) && (used[y])) sum--,fa[find(y)]=find(q[i]);
其次,把 used[q[i]]=1; 一句需要再往后移,就比如到 if(sum==1) ans[i]=1; 后。


by LJN1117 @ 2024-10-22 21:46:53

@LG086 过了,非常感谢


|