제출 #1278262

#제출 시각아이디문제언어결과실행 시간메모리
1278262al95ireyizSplit the Attractions (IOI19_split)C++20
0 / 100
2094 ms16552 KiB
#pragma GCC optimize("O3", "fast-math", "unroll-loops", "no-stack-protector") #include <bits/stdc++.h> using namespace std; #if !defined(ONLINE_JUDGE) and !defined(EVAL) #include "template/debug.h" #else #define d(x...) #endif #define fr first #define er erase #define in insert #define sc second #define ll long long #define pb push_back #define vll vector<ll> #define pll pair<ll,ll> #define len(x) (ll) x.size() #define all(x) x.begin(),x.end() const ll INF = 1e9, INFL = 1e18; const ll MOD = 1e9 + 7; // const ll MOD = 998244353; const ll maxn = 1e5 + 5; ll n, m, k = 0; vll g[maxn]; vector<int>cv; ll a, b, c, cal[4]; bitset<maxn>vis; vll last; ll dfs(ll u){ last.pb(u); vis[u] = 1; ll cv = 1; for(auto v : g[u]){ if(vis[v]) continue; cv += dfs(v); } return cv; } void dfs2(ll u){ vis[u] = 1; cv[u - 1] = 1; a --; if(a == 0) return; for(auto v : g[u]){ if(vis[v]) continue; dfs2(v); if(a == 0) return; } } void dfs3(ll u){ vis[u] = 1; cv[u - 1] = 2; b --; if(b == 0) return; for(auto v : g[u]){ if(vis[v]) continue; dfs3(v); if(b == 0) return; } } ll in[maxn], sr[maxn]; vector<int> find_split(int _n, int _a, int _b, int _c, vector<int> p, vector<int> q) { n = _n, a = _a, b = _b, c = _c; cal[1] = 1, cal[2] = 2, cal[3] = 3; if(a > b) swap(a, b), swap(cal[1], cal[2]); if(a > c) swap(a, c), swap(cal[1], cal[3]); if(b > c) swap(b, c), swap(cal[2], cal[3]); cv.assign(n, 3); for(ll i = 0; i < len(p); i ++){ g[p[i] + 1].pb(q[i] + 1); g[q[i] + 1].pb(p[i] + 1); in[p[i] + 1] ++, in[q[i] + 1] ++; } ll ch = 0; pll tp; for(ll i = 1; i <= n; i ++) sr[i] = i; sort(sr + 1, sr + n + 1, [&](auto x, auto y){ return in[x] < in[y]; }); set<ll>s; for(ll __ = 1; __ <= n; __ ++){ ll root = sr[__]; if(s.count(root)) continue; vis.reset(); vis[root] = 1; for(auto i : g[root]){ last.clear(); ll le = dfs(i); if(le >= a and n - le >= b){ ch = 1; tp = {i, root}; break; } else if(le < a){ for(auto x : last) s.in(x); } } if(ch) break; } if(!ch){ for(ll i = 0; i <= n - 1; i ++) cv[i] = 0; return cv; } vis.reset(); auto [node, root] = tp; vis[root] = 1; dfs2(node); vis[root] = 0; dfs3(root); for(ll i = 0; i <= n - 1; i ++){ cv[i] = cal[cv[i]]; } return cv; } // void _() { // } // signed main() { // ll tm = clock(); // cin.tie(0)->sync_with_stdio(0); // ll t = 1; // // cin >> t; // for(ll tt = 1; tt <= t; tt ++) _(); // cerr << "\n\033[1;31mTime: \033[1;30m" \ // << (double)(clock()-tm)/1000000 << "\033[1;32m seconds\n"; // }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...