Submission #1279101

#TimeUsernameProblemLanguageResultExecution timeMemory
1279101PlayVoltzMaking Friends on Joitter is Fun (JOI20_joitter2)C++20
100 / 100
761 ms66340 KiB
#include <cstdio> #include <stdio.h> #include <stdbool.h> #include <iostream> #include <map> #include <vector> #include <climits> #include <stack> #include <string> #include <queue> #include <algorithm> #include <set> #include <unordered_set> #include <unordered_map> #include <cmath> #include <cctype> #include <bitset> #include <iomanip> #include <cstring> #include <numeric> #include <cassert> #include <random> using namespace std; #define int long long #define pii pair<int, int> #define mp make_pair #define pb push_back #define fi first #define se second int ans=0; queue<pii> ord; vector<int> dsu, sz; vector<set<int> > graph, tgraph, child; int fp(int a){ if (dsu[a]==-1)return a; return dsu[a]=fp(dsu[a]); } void insert(int a, int b){ graph[a].insert(b); tgraph[b].insert(a); if (graph[b].find(a)!=graph[b].end())ord.push(mp(a, b)); } void merge(int a, int b){ a=fp(a), b=fp(b); if (a==b)return; if (sz[a]+graph[a].size()+child[a].size()>sz[b]+graph[b].size()+child[b].size())swap(a, b); ans+=sz[a]*child[b].size()+sz[b]*child[a].size(); sz[b]+=sz[a]; dsu[a]=b; for (auto c:child[a]){ if (child[b].find(c)==child[b].end())child[b].insert(c); else ans-=sz[b]; } graph[a].erase(b); tgraph[b].erase(a); graph[b].erase(a); tgraph[a].erase(b); for (auto c:graph[a])tgraph[c].erase(a), insert(b, c); for (auto c:tgraph[a])graph[c].erase(a), insert(c, b); } int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, q, a, b; cin>>n>>q; graph.resize(n+1); tgraph.resize(n+1); dsu.resize(n+1, -1); sz.resize(n+1, 1); child.resize(n+1); for (int i=1; i<=n; ++i)child[i].insert(i); while (q--){ cin>>a>>b; b=fp(b); if (fp(a)!=b&&child[b].find(a)==child[b].end()){ child[b].insert(a); ans+=sz[b]; a=fp(a); insert(a, b); while (ord.size())merge(ord.front().fi, ord.front().se), ord.pop(); } cout<<ans<<"\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...