제출 #937403

#제출 시각아이디문제언어결과실행 시간메모리
937403Darren0724조이터에서 친구를 만드는건 재밌어 (JOI20_joitter2)C++17
0 / 100
10 ms26968 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define all(x) x.begin(),x.end() #define abcorz ios_base::sync_with_stdio(false);cin.tie(0); const int N=200005; const int mod=1e9+7; const int INF=1e9; queue<pair<int,int>> q; namespace{ vector<int> pa(N,-1); int Find(int k){ return pa[k]<0?k:pa[k]=Find(pa[k]); } void onion(int a,int b,vector<set<int>> &adj,vector<set<int>> &to){ a=Find(a),b=Find(b); if(a==b)return; if(adj[a].size()>adj[b].size())swap(a,b); pa[b]+=pa[a]; pa[a]=b; for(int j:to[a]){ to[b].insert(j); if(adj[b].find(j)!=adj[b].end()){ q.push({b,j}); } } for(int j:adj[a]){ adj[b].insert(j); if(to[b].find(j)!=to[b].end()){ q.push({b,j}); } } } }; vector<int> adj[N],vis(N); int dfs(int k){ vis[k]=1; int cnt=1; for(int j:adj[k]){ if(vis[j])continue; cnt+=dfs(j); } return cnt; } int32_t main(){ abcorz; int n,m;cin>>n>>m; vector<set<int>> adj(N),to(N); for(int j=1;j<=n;j++){ adj[j].insert(j); } for(int i=0;i<m;i++){ int a,b;cin>>a>>b; if(to[b].find(a)!=to[b].end()){ q.push({a,b}); while(q.size()){ auto [a,b]=q.front(); q.pop(); onion(a,b,adj,to); } } adj[Find(b)].insert(a); to[a].insert(b); int ans=-n; for(int j=1;j<=n;j++){ if(Find(j)!=j)continue; ans+=(-pa[j])*(int)(adj[j].size()); } cout<<ans<<endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...