제출 #1205782

#제출 시각아이디문제언어결과실행 시간메모리
1205782mychecksedad조이터에서 친구를 만드는건 재밌어 (JOI20_joitter2)C++20
1 / 100
5090 ms1188 KiB
/* Author : Mychecksdead */ #include<bits/stdc++.h> using namespace std; #define ll long long int #define cerr if(false) cerr #define MOD (1000000000+7) #define MOD1 (998244353) #define pb push_back #define all(x) x.begin(), x.end() #define en cout << '\n' #define ff first #define ss second #define pii pair<int,int> #define vi vector<int> const int N = 5000+100, M = 1e5+10, K = 52, MX = 30; struct Dsu { vector<int> s, p; int sz; Dsu(int n){ sz = n; s.resize(n+1, 1); p.resize(n+1); for(int i = 0; i <= n; ++i) p[i] = i; } int find(int v){ if(p[v] == v) return v; return (p[v] = find(p[v])); } void merge(int a, int b){ a = find(a); b = find(b); if(a != b){ if(s[a] > s[b]){ swap(a, b); } s[b] += s[a]; p[a] = b; sz--; } } }; int n, m; vector<pii> E; void solve(){ cin >> n >> m; Dsu d(n); for(int i = 1; i <= m; ++i){ int u, v; cin >> u >> v; E.pb({u, d.find(v)}); bool ok = 1; while(ok){ ok = 0; map<pii, int> is; for(auto [x, y]: E){ if(is[{d.find(y), d.find(x)}] && d.find(x) != d.find(y)){ d.merge(x, y); ok = 1; break; } is[{d.find(x), d.find(y)}] = 1; } } vector<vi> g(n+1); for(auto [x, y]: E){ if(d.find(x) != d.find(y)) g[x].pb(d.find(y)); } int ans = 0; for(int j = 1; j <= n; ++j){ sort(all(g[j])); g[j].erase(unique(all(g[j])), g[j].end()); for(int y: g[j]) ans += d.s[y]; if(d.find(j) == j){ ans += d.s[j] * d.s[j] - d.s[j]; } } cout << ans << '\n'; } } int main(){ cin.tie(0); ios::sync_with_stdio(0); int tt = 1, aa; // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); while(tt--){ solve(); en; } cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...