제출 #734044

#제출 시각아이디문제언어결과실행 시간메모리
734044lukameladze조이터에서 친구를 만드는건 재밌어 (JOI20_joitter2)C++14
100 / 100
974 ms114064 KiB
# include <bits/stdc++.h> using namespace std; #define f first #define s second #define int long long #define pii pair <int, int> #define pb push_back const int N = 3e5 + 5; int t,n,a[N],p[N],m; long long ans, sz[N]; set <int> g[N], rg[N],v[N],comp[N]; int get(int sz) { return sz * (sz - 1); } int get_col(int a) { if (a == p[a]) return a; else return p[a] = get_col(p[a]); } void col(int a, int b) { a = get_col(a); b = get_col(b); if (a == b) return ; if (comp[a].size() < comp[b].size()) swap(a,b); ans -= get(sz[a]); ans -= get(sz[b]); ans -= v[a].size() * sz[a]; ans -= v[b].size() * sz[b]; ans += get(sz[a] + sz[b]); for (int x : v[b]) { if (get_col(x) != a) v[a].insert(x); } for (int x : comp[b]) { if (v[a].count(x)) { v[a].erase(x); } comp[a].insert(x); p[x] = a; } comp[b].clear(); ans += v[a].size() * (sz[a] + sz[b]); v[b].clear(); p[b] = a; sz[a] += sz[b]; sz[b] = 0; vector <pii> vec; for (int to : g[b]) { rg[to].erase(b); if (get_col(to) != a) { rg[to].insert(a), g[a].insert(to); if (g[to].count(a)) vec.pb({to, a}); } } for (int to : rg[b]) { g[to].erase(b); if (get_col(to) != a) { g[to].insert(a), rg[a].insert(to); if (g[a].count(to)) vec.pb({to, a}); } } for (pii sth : vec) { col(sth.f, sth.s); } /* while (s[x].lower_bound({y, 0}) != s[x].end()){ pii sth = *s[x].lowesr_bound({y, 0}); if (sth.f != y) break; s[x].erase(sth); } while (s[y].lower_bound({x, 0}) != s[y].end()) { pii sth = *s[y].lower_bound({x, 0}); if (sth.f != x) break; s[y].erase(sth); } */ } main() { std::ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0); cin>>n>>m; for (int i = 1; i <= n; i++) { p[i] = i; sz[i] = 1; comp[i].insert(i); } for (int i = 1; i <= m; i++) { int a, b; cin>>a>>b; int x = get_col(a), y = get_col(b); if (x == y) { cout<<ans<<'\n'; continue; } if (v[y].count(a)) { cout<<ans<<'\n'; continue; } g[x].insert(y); rg[y].insert(x); v[y].insert(a); ans += sz[y]; if (g[x].count(y) && g[y].count(x)) { col(x, y); } cout<<ans<<'\n'; } }

컴파일 시 표준 에러 (stderr) 메시지

joitter2.cpp:69:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   69 | main() {
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...