Submission #1114679

#TimeUsernameProblemLanguageResultExecution timeMemory
1114679SalihSahinPovjerenstvo (COI22_povjerenstvo)C++14
13 / 100
598 ms157968 KiB
#include <bits/stdc++.h> #define pb push_back using namespace std; const int N = 5e5 + 5; vector<int> adj[N*2], adjrev[N], vis(N), comp(N), col(N); vector<int> nodes; vector<vector<int> > group[2]; void dfs(int node){ vis[node] = 1; for(auto itr: adj[node]){ if(!vis[itr]){ dfs(itr); } } nodes.pb(node); } void dfs2(int node, int compcnt, int color){ vis[node] = 1; comp[node] = compcnt; col[node] = color; group[col[node]][compcnt].pb(node); for(auto itr: adjrev[node]){ if(!vis[itr]){ dfs2(itr, compcnt, (color^1)); } } } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m; cin>>n>>m; vector<pair<int, int> > edge(m); for(int i = 0; i < m; i++){ int u, v; cin>>u>>v; edge[i] = {u, v}; adj[u].pb(v); adjrev[v].pb(u); } for(int i = 1; i <= n; i++){ if(!vis[i]){ dfs(i); } } reverse(nodes.begin(), nodes.end()); for(int i = 0; i <= n; i++) vis[i] = 0; vector<int> v; int compcnt = 0; for(auto itr: nodes){ if(!vis[itr]){ group[0].pb(v); group[1].pb(v); dfs2(itr, compcnt, 0); compcnt++; } } for(int i = 1; i <= n; i++){ adj[i].clear(); } // memory israf etme for(int i = 0; i < m; i++){ int fnode = comp[edge[i].first] * 2 + col[edge[i].first]; int snode = comp[edge[i].second] * 2 + col[edge[i].second]; adj[fnode].pb(snode); } vector<int> ans; vector<int> take(N*2, 0); // 0 = ?, 1 aldık, -1 alamayız take[(compcnt - 1) * 2 + 1] = 1; // son sccnin 1 ini almayı dene for(auto itr: group[1][compcnt-1]) ans.pb(itr); take[(compcnt - 1) * 2] = -1; for(int i = compcnt-2; i >= 0; i--){ int node0 = i*2, node1 = i*2+1; for(auto itr: adj[node0]){ if(take[itr] == 1) take[node0] = -1; } for(auto itr: adj[node1]){ if(take[itr] == 1) take[node1] = -1; } if(take[node0] == -1 && take[node1] == -1) continue; if(take[node0] == -1){ take[node1] = 1; for(auto itr: group[1][i]) ans.pb(itr); } else{ take[node0] = 1; for(auto itr: group[0][i]) ans.pb(itr); } } bool check = 1; vector<int> inans(n+1), hehas(n+1); for(auto itr: ans) inans[itr] = 1; for(int i = 0; i < m; i++){ if(inans[edge[i].first] && inans[edge[i].second]) check = 0; if(!inans[edge[i].first] && inans[edge[i].second]) hehas[edge[i].first] = 1; } for(int i = 1; i <= n; i++){ if(inans[i] == 0 && hehas[i] == 0) check = 0; } if(ans.size() == 0) check = 0; if(check){ cout<<ans.size()<<endl; for(auto itr: ans){ cout<<itr<<" "; } cout<<endl; } else{ for(int i = 0; i < 2*N; i++) take[i] = 0; ans.clear(); take[(compcnt - 1) * 2 + 1] = -1; // son sccnin 1 ini almayı dene for(auto itr: group[0][compcnt-1]) ans.pb(itr); take[(compcnt - 1) * 2] = 1; for(int i = compcnt-2; i >= 0; i--){ int node0 = i*2, node1 = i*2+1; for(auto itr: adj[node0]){ if(take[itr] == 1) take[node0] = -1; } for(auto itr: adj[node1]){ if(take[itr] == 1) take[node1] = -1; } if(take[node0] == -1 && take[node1] == -1) continue; if(take[node0] == -1){ take[node1] = 1; for(auto itr: group[1][i]) ans.pb(itr); } else{ take[node0] = 1; for(auto itr: group[0][i]) ans.pb(itr); } } cout<<ans.size()<<endl; for(auto itr: ans){ cout<<itr<<" "; } cout<<endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...