제출 #1064921

#제출 시각아이디문제언어결과실행 시간메모리
1064921ewirlanSplit the Attractions (IOI19_split)C++17
0 / 100
50 ms16980 KiB
// #ifndef __SIZEOF_INT128__ #define __SIZEOF_INT128__ #endif #pragma GCC optimize("Ofast") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace chrono; using namespace __gnu_pbds; template <typename T> using oset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>; #define rep(i, p, k) for(int i(p); i < (k); ++i) #define per(i, p, k) for(int i(p); i > (k); --i) #define sz(x) (int)(x).size() #define sc static_cast typedef long long ll; typedef long double ld; typedef unsigned int uint; typedef unsigned long long ull; typedef __int128_t lll; //#define int ll template <typename T = int> using par = std::pair <T, T>; #define fi first #define se second #define test int _number_of_tests(in()); while(_number_of_tests--) #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() #define pb emplace_back struct Timer { string name{""}; time_point<high_resolution_clock> end, start{high_resolution_clock::now()}; duration<float, std::milli> dur; Timer() = default; Timer(string nm): name(nm) {} ~Timer() { end = high_resolution_clock::now(); dur= end - start; cout << "@" << name << "> " << dur.count() << " ms" << '\n'; } }; template <typename T = int> inline T in() { static T x; std::cin >> x; return x; } std::string yn(bool b) { if(b) return "YES\n"; else return "NO\n"; } template <typename F, typename S> std::ostream& operator<<(std::ostream& out, const std::pair <F, S>& par); template <typename T> std::ostream& operator<< (std::ostream& out, const std::vector <T>& wek) { for(const auto& i : wek)out << i << ' '; return out; } template <typename F, typename S> std::ostream& operator<<(std::ostream& out, const std::pair <F, S>& par) { out << '{'<<par.first<<", "<<par.second<<"}"; return out; } #define show(x) cerr << #x << " = " << x << '\n'; constexpr int maxn = 1e5 + 3; vector <int> graf[maxn]; int low[maxn], siz[maxn], pok[maxn]; vector <int> u[maxn], sy[maxn]; int dfs(int w, int l, int r, int p = 1) { low[w] = pok[w] = p; siz[w] = 1; int s(1); vector <pair <int, int>> v; for(auto i: graf[w]){ if(!pok[i]){ sy[w].pb(i); int d(dfs(i, l, r, p+1)); if(d)return d; low[w] = min(low[w], low[i]); siz[w] += siz[i]; if(low[i] >= p){ s += siz[i]; u[w].pb(i); } else if(siz[i] < l)v.pb(i, siz[i]); } else if(pok[i] != pok[w]-1)low[w] = min(low[w], pok[i]); } // cerr << w << ": " << v << '\n'; int i(0); while(s < l && i < sz(v)){ u[w].pb(v[i].first); s += v[i++].second; } if(l <= s && s <= r)return w+1; return 0; } bool wpo[maxn]; void dfs2(int w){ wpo[w] = 1; for(auto i: sy[w])dfs2(i); } vector <int> find_split(const int n, int aa, int bb, int cc, vector <int> p, vector <int> q) { const int m(sz(p)); int a(min({aa, bb, cc})), c(max({aa, bb, cc})), b(n-a-c); int ia(aa < bb ? (aa < cc ? 1 : 3) : (bb < cc ? 2 : 3)), ic(aa < bb ? (bb < cc ? 3 : 2) : (aa < cc ? 3 : 1)), ib(6 - ia - ic); rep(i, 0, m){ graf[p[i]].pb(q[i]); graf[q[i]].pb(p[i]); } int d(dfs(0, a, n-b)); if(d == 0)return vector <int>(n, 0); --d; vector <int> odp(n, ic); wpo[d] = 1; for(auto i: u[d])dfs2(i); // cerr << d << '\n'; // rep(i, 0, n)cerr << i << ": " << siz[i] << ' ' << pok[i] << ' ' << low[i] << " {" << sy[i] << "} {" << u[i] << "} " << wpo[i] << '\n'; rep(i, 0, n){ if(wpo[i]){ if(a){ --a; odp[i] = ia; } } else{ if(b){ --b; odp[i] = ib; } } } return odp; }
#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...