Submission #837932

#TimeUsernameProblemLanguageResultExecution timeMemory
837932MohamedAhmed04Making Friends on Joitter is Fun (JOI20_joitter2)C++14
100 / 100
867 ms77892 KiB
#include <bits/stdc++.h> using namespace std ; const int MAX = 1e5 + 10 ; int arr[MAX] ; int n , m ; int par[MAX] , sz[MAX] ; set<int>adj1[MAX] , adj2[MAX] ; //from a clique to another clique and reverse set<int>adj[MAX] , adjr[MAX] ; //from a node to clique and reverse edge vector<int>v[MAX] ; int cnt[MAX] ; void init() { for(int i = 1 ; i <= n ; ++i) par[i] = i , sz[i] = 1 , v[i] = {i} ; } int root(int node) { if(par[node] == node) return node ; return (par[node] = root(par[node])) ; } long long ans = 0 ; void Union(int x , int y) { int a = root(x) ; int b = root(y) ; if(a == b) return ; if(sz[a] < sz[b]) swap(a , b) ; vector<int>newedges ; for(auto &node : adj1[b]) { adj1[a].insert(node) , adj2[node].erase(b) , adj2[node].insert(a) ; if(adj2[a].find(node) != adj2[a].end()) newedges.push_back(node) ; } for(auto &node : adj2[b]) { adj1[node].erase(b) ; adj1[node].insert(a) ; adj2[a].insert(node) ; if(adj1[a].find(node) != adj1[a].end()) newedges.push_back(node) ; } ans += 1ll * (sz[a] + cnt[a]) * sz[b] ; for(auto &node : v[b]) { if(adjr[a].find(node) == adjr[a].end()) ans += sz[a] ; else ans -= sz[b] , cnt[a]-- , adjr[a].erase(node) ; v[a].push_back(node) ; } v[b].clear() ; for(auto &node : adjr[b]) //from node outside b to b { if(root(node) == a || adjr[a].find(node) != adjr[a].end()) ans -= sz[b] , cnt[b]-- ; else ans += sz[a] , adjr[a].insert(node) ; } par[b] = a ; sz[a] += sz[b] ; cnt[a] += cnt[b] ; for(auto &node : newedges) Union(a , node) ; } int main() { ios_base::sync_with_stdio(0) ; cin.tie(0) ; cin>>n>>m ; init() ; for(int i = 0 ; i < m ; ++i) { int x , y ; cin>>x>>y ; if(root(x) != root(y)) { if(adj1[root(y)].find(root(x)) != adj1[root(y)].end()) Union(x , y) ; else if(adjr[root(y)].find(x) == adjr[root(y)].end()) { ans += sz[root(y)] , cnt[root(y)]++ ; adjr[root(y)].insert(x) , adj1[root(x)].insert(root(y)) , adj2[root(y)].insert(root(x)) ; } } cout<<ans<<"\n" ; } return 0 ; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...