Submission #939499

#TimeUsernameProblemLanguageResultExecution timeMemory
939499WonderfulWhaleMaking Friends on Joitter is Fun (JOI20_joitter2)C++17
100 / 100
1146 ms87468 KiB
#include<bits/stdc++.h> using namespace std; #define int int64_t #define pb push_back #define pii pair<int, int> #define st first #define nd second #define sz(x) (int)(x).size() #define all(x) (x).begin(), (x).end() const int MAXN = 100'009; int cnt[MAXN]; int p[MAXN]; int sz[MAXN]; int sum[MAXN]; vector<int> V[MAXN]; set<int> In[MAXN]; set<int> Out[MAXN]; set<int> in[MAXN]; set<int> out[MAXN]; int ans; int Find(int x) { return x==p[x]?x:p[x]=Find(p[x]); } void Union(int a, int b) { a = Find(a); b = Find(b); if(a==b) return; ans -= sz[a]*sz(In[a]); ans -= sz[b]*sz(In[b]); ans -= sz[a]*(sz[a]-1); ans -= sz[b]*(sz[b]-1); vector<int> union_queue; if(sz(out[a])+sz(in[a])<sz(out[b])+sz(in[b])) swap(a, b); for(int x:out[b]) { if(x==a) continue; if(in[a].count(x)) { union_queue.pb(x); } out[a].insert(x); in[x].erase(b); in[x].insert(a); } for(int x:In[b]) { if(Find(x)!=a) { In[a].insert(x); } } In[b].clear(); for(int x:V[b]) { In[a].erase(x); V[a].pb(x); } V[b].clear(); out[b].clear(); for(int x:in[b]) { if(x==a) continue; if(out[a].count(x)) { union_queue.pb(x); } in[a].insert(x); out[x].erase(b); out[x].insert(a); } in[b].clear(); p[b] = a; sz[a] += sz[b]; ans += sz[a]*(sz[a]-1); ans += sz[a]*sz(In[a]); for(int x:union_queue) { Union(a, x); } } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m; cin >> n >> m; iota(p, p+n+1, 0); fill(sz, sz+n+1, 1); for(int i=1;i<=n;i++) { V[i].pb(i); } for(int i=0;i<m;i++) { int a, b; cin >> a >> b; int A = Find(a); int B = Find(b); if(A==B) goto skip; out[A].insert(B); if(in[A].count(B)) { Union(A, B); } else { ans -= sz[B]*sz(In[B]); in[B].insert(A); In[B].insert(a); Out[a].insert(B); ans += sz[B]*sz(In[B]); } skip: cout << ans << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...