Submission #1108277

#TimeUsernameProblemLanguageResultExecution timeMemory
1108277damwuanMaking Friends on Joitter is Fun (JOI20_joitter2)C++17
100 / 100
1176 ms115664 KiB
#include<bits/stdc++.h> using namespace std; #define pb push_back #define fi first #define se second #define for1(i,j,k) for(int i=j;i<=k;i++) #define for2(i,j,k) for(int i=j;i>=k;i--) #define for3(i,j,k,l) for(int i=j;i<=k;i+=l) #define int long long typedef long long ll; typedef pair<int,int> pii; const ll maxn=3e5+12; const ll offset=2e5; const ll inf=1e18; const int base=350; const ll mod=998244353; int n,m; int par[maxn]; set<int> adj[maxn],adj_r[maxn],L[maxn]; int res; vector<pii> Q; int Find(int u) { return par[u]<0?u:par[u]=Find(par[u]); } void Union(int u,int v) { if ((u=Find(u))==(v=Find(v))) return; if (L[u].size() + adj[u].size() + adj_r[u].size() < L[v].size()+adj[v].size()+adj_r[v].size()) swap(u,v); res+=-par[u]*L[v].size() - par[v]*L[u].size(); // cerr<<u<<' '<<v<<' '<< res<<'\n'; par[u]+=par[v]; par[v]=u; for(int x: L[v]) { if (L[u].find(x)!=L[u].end()) { res+=par[u]; continue; } L[u].insert(x); } L[v].clear(); adj[u].erase(v);adj_r[u].erase(v);adj[v].erase(u);adj_r[v].erase(u); for(int x:adj[v]) { // x=Find(x); adj[u].insert(x); adj_r[x].insert(u); if (adj_r[u].find(x)!=adj_r[u].end()) Q.pb({u,x}); } // adj[v].clear(); for(int x:adj_r[v]) { // x=Find(x); adj_r[u].insert(x); adj[x].insert(u); // cerr<< adj[u].count(x)<<'\n'; if (adj[u].find(x)!=adj[u].end()) Q.pb({u,x}); } // adj_r[v].clear(); } void sol() { cin >>n>>m; for1(i,1,n) { par[i]=-1; L[i].insert(i); } for1(i,1,m) { int u,v;cin >> u>> v; v=Find(v); if (u==v || L[v].find(u)!=L[v].end()) cout << res<<'\n'; else { L[v].insert(u); u=Find(u); adj[u].insert(v); adj_r[v].insert(u); res-=par[v]; // cerr<< res<<" ashiba\n"; if (adj_r[u].find(v)!=adj_r[u].end()) Q.pb({u,v}); while (!Q.empty()) { // cerr<<" ulion "<<Q.back().fi<<' '<<Q.back().se<<'\n'; pii x=Q.back(); Q.pop_back(); Union(x.fi,x.se); } cout << res<<'\n'; } } } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(NULL); // freopen("adfaf.inp","r",stdin); // freopen("adfaf.out","w",stdout); int t=1;//cin >> t; while (t--) { sol(); } } /* 4 3 1 2 2 3 3 2 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...