Submission #1348148

#TimeUsernameProblemLanguageResultExecution timeMemory
1348148settopGuessing Game (EGOI23_guessinggame)C++20
0 / 100
13 ms28892 KiB
#include<bits/stdc++.h>

using namespace std;

#define int long long
#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define all(x) x.begin(),x.end()
#define sz(x) (int)x.size()
#define pb push_back
const int MAXN=3e5+10;
const int inf=1e16;

map<int,bool> mp[MAXN];
int n,m,k,pai[MAXN],root[MAXN],id[MAXN],cur,par[MAXN];
vector<int> rev[MAXN],cand,group[MAXN];
set<int> st;
bool obrigado[MAXN];

int find(int x){
    return x==par[x]?x:par[x]=find(par[x]);
}

void join(int a,int b){
    a=find(a),b=find(b);
    if(a==b) return;
    par[b]=a;
}

void merge(int a,int b){
    pai[b]=a;
    if(sz(group[b])>sz(group[a])){
        group[a].swap(group[b]);
        id[a]=id[b];
    }
    for(auto x:group[id[b]]) group[id[a]].pb(x);
}

void bfs(int x){
    queue<int> fila; fila.push(x);
    id[x]=++cur;
    while(!fila.empty()){
        auto i=fila.front(); fila.pop();
        group[cur].pb(i);
        vector<int> ncd;
        for(auto u:cand){
            if(u==x) continue;
            if(mp[u][i]) ncd.pb(u);
            else{
                pai[u]=i;
                fila.push(u);
            }
        }
        cand=ncd;
    }
    vector<int> to_pop;
    for(auto r:st){
        bool fd=0;
        for(auto u:group[id[r]]){
            if(mp[r][u] || obrigado[u]) continue;
            for(auto j:group[id[x]]){
                if(!mp[u][j]){
                    pai[u]=j;
                    if(u!=r) pai[r]=u;
                    fd=1;
                    break;
                }
            }
            if(fd){
                to_pop.pb(r);
                merge(x,r);
                break;
            }
        }
    }
    for(auto u:to_pop) st.erase(u);
    st.insert(x);
}

int32_t main(){
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin>>n>>m>>k;
    fall(i,0,n-1) pai[i]=-1,par[i]=i;
    bool da=1;
    fall(i,1,m){
        int a,b; cin>>a>>b;
        if(find(a)==find(b)) da=0;
        pai[a]=b; rev[b].pb(a); obrigado[a]=1;
        join(a,b);
    }
    fall(i,1,k){
        int a,b; cin>>a>>b;
        mp[a][b]=1; 
    }
    if(!da){
        cout<<"NO\n";
        return 0;
    }
    fall(i,0,n-1) if(pai[i]==-1) cand.pb(i);
    fall(i,0,n-1){
        if(pai[i]==-1) bfs(i);
    }
    if(sz(st)>1){
        cout<<"NO\n";
        return 0;
    }
    fall(i,0,n-1) if(pai[i]!=-1) cout<<i<<" "<<pai[i]<<"\n";

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...