제출 #579323

#제출 시각아이디문제언어결과실행 시간메모리
579323OttoTheDinoMeetings (JOI19_meetings)C++17
100 / 100
1050 ms980 KiB
#include "meetings.h" #include <bits/stdc++.h> using namespace std; #define rep(i,s,e) for (int i = s; i <= e; ++i) #define fi first #define se second #define all(a) a.begin(), a.end() #define len(a) (int)a.size() #define pb push_back typedef pair<int,int> ii; typedef vector<int> vi; typedef vector<ii> vii; const int mx = 2000; vi kids[mx]; int sz[mx], par[mx], done[mx]; int bot (int u, int id) { vii ord; for (int v : kids[u]) ord.pb({sz[v],v}); sort(all(ord)); reverse(all(ord)); if (id >= len(ord)) return u; return bot (ord[id].se, 0); } void upd (int u) { sz[u]++; if (par[u]) upd(par[u]); } void Solve(int n) { done[0] = 1; rep (i,1,n-1) { if (done[i]) continue; int cur = 0, id = 0, y = i, x = -1; while (true) { x = bot(cur, id); if (x==cur) break; int res = Query (0, i, x); if (!done[res]) { if (res!=i) { par[i] = res; kids[res].pb(i); y = res; } break; } if (res!=cur) { cur = res; id = 0; } else id++; } vi a; while (x!=0) { a.pb(x); x = par[x]; } a.pb(0); int lo = 0, hi = len(a)-1; while (lo<hi) { int mid = (lo+hi)/2; int res = Query (0, a[mid], y); if (res==y) lo = mid+1; else hi = mid; } par[y] = a[lo]; kids[a[lo]].pb(y); if (lo != 0) { par[a[lo-1]] = y; kids[a[lo]].erase(find(all(kids[a[lo]]),a[lo-1])); kids[y].pb(a[lo-1]); } upd(i); if (y!=i) upd (y); done[i] = done[y] = 1; } rep (i,1,n-1) Bridge(min(par[i],i), max(i,par[i])); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...