Submission #1225141

#TimeUsernameProblemLanguageResultExecution timeMemory
1225141GrayMaking Friends on Joitter is Fun (JOI20_joitter2)C++17
0 / 100
0 ms320 KiB
#include <algorithm> #include <bits/stdc++.h> #include <cassert> #define ll long long #define ff first #define ss second #define ln "\n" const ll INF = 2e18; const ll MOD = 1e9+7; using namespace std; struct DSU{ vector<ll> p; vector<set<ll>> nodes; vector<set<ll>> in, out; stack<pair<ll, ll>> buffer; ll n, cnt; DSU(ll N){ n=N; p.resize(N+1, -1); cnt=0; nodes.resize(n+1); for (ll i=1; i<=n; i++) nodes[i].insert(i); in.resize(n+1); out.resize(n+1); } ll get(ll x){ return p[x]==-1?x:p[x]=get(p[x]); } void unite(ll u, ll v){ if (in[u].size()+out[u].size()+nodes[u].size()<in[v].size()+out[v].size()+nodes[v].size()) swap(u, v); p[v]=u; for (auto cv:in[v]){ out[cv].erase(v); cnt-=nodes[v].size(); buffer.push({cv, u}); } for (auto cv:out[v]){ in[cv].erase(v); cnt-=nodes[cv].size(); buffer.push({u, cv}); } cnt+=nodes[v].size()*(nodes[u].size())*2; cnt+=nodes[v].size()*in[u].size(); for (auto cv:nodes[v]){ nodes[u].insert(cv); } } void link(ll u, ll v){ buffer.push({u, v}); while (!buffer.empty()){ tie(u, v) = buffer.top(); u=get(u); v=get(v); buffer.pop(); if (u==v or out[u].count(v)) continue; else if (out[v].count(u)){ unite(u, v); }else{ cnt+=nodes[v].size(); out[u].insert(v); in[v].insert(u); } } } }; void solve(){ ll n, m; cin >> n >> m; DSU tr(n); for (ll i=0; i<m; i++){ ll u, v; cin >> u >> v; tr.link(u, v); cout << tr.cnt << ln; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); ll t=1; // cin >> t; while (t--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...