#ifdef NDEBUG #undef LOCAL #endif #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using ll = long long; using ull = unsigned long long; using ld = long double; using pii = pair<int,int>; using pll = pair<ll,ll>; using vi = vector<int>; using vb = vector<bool>; using vc = vector<char>; using vvc = vector<vc>; using vvi = vector<vi>; using vvb = vector<vb>; using vpii = vector<pii>; using vpll = vector<pll>; using vll = vector<ll>; using vull = vector<ull>; using vvll = vector<vll>; using namespace __gnu_pbds; template <typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #define f first #define s second #define pb emplace_back #define rep(i, begin, end) for(auto i = (begin); i <= (end); ++i) #define repr(i, begin, end) for(auto i = (begin); i >= (end); --i) #define bend(X) X.begin(), X.end() constexpr int INF = 1e9+1e7; constexpr ll INFl = INF; constexpr ll INFll = 1e18+1e16; #ifndef LOCAL #define endl '\n' #endif template <typename T> void print(T x) { cout << x << endl; } template <typename T, typename... Args> void print(T x, Args... args) { cout << x << ' '; print(args...); } #ifdef LOCAL template <typename T> void _deb(T x) { cout << x << endl; } template <typename T, typename... Args> void _deb(T x, Args... args) { cout << x << ", "; _deb(args...); } #define deb(...) do { cout << #__VA_ARGS__ << " = "; _deb(__VA_ARGS__); } while (false) #define say(...) print(__VA_ARGS__); template <typename T1, typename T2> ostream& operator<<(ostream& os, pair<T1,T2> x) { os << '(' << x.f << ", " << x.s << ')'; return os; } template <typename Ch, typename Tr, typename T> ostream& operator<<(basic_ostream<Ch,Tr>& os, T x) { bool first = true; os << '['; for(auto i : x) { if (!first) os << ", "; os << i; first = false; } os << ']'; return os; } #else #define deb(...) #define say(...) template <typename T1, typename T2> ostream& operator<<(ostream& os, pair<T1,T2> x) { os << x.f << ' ' << x.s; return os; } template <typename Ch, typename Tr, typename T> ostream& operator<<(basic_ostream<Ch,Tr>& os, T x) { for(auto i : x) os << i << ' '; return os; } #endif template <typename T1, typename T2> istream& operator>>(istream& is, pair<T1,T2>& x) { is >> x.f >> x.s; return is; } template <typename T> istream& operator>>(istream& is, vector<T>& x) { for(T& i : x) is >> i; return is; } template <typename T1, typename T2> pair<T1,T2> operator+(const pair<T1,T2>& A, const pair<T1,T2>& B) { return {A.f+B.f, A.s+B.s}; } template <typename T1, typename T2> pair<T1,T2> operator-(const pair<T1,T2>& A, const pair<T1,T2>& B) { return {A.f-B.f, A.s-B.s}; } template <typename T1, typename T2> pair<T1,T2>& operator+=(pair<T1,T2>& A, const pair<T1,T2>& B) { A.f += B.f; A.s += B.s; return A; } template <typename T1, typename T2> pair<T1,T2>& operator-=(pair<T1,T2>& A, const pair<T1,T2>& B) { A.f -= B.f; A.s -= B.s; return A; } template <typename T1, typename T2> pair<T1,T2> operator-(const pair<T1,T2>& A) { return {-A.f, -A.s}; } template <typename T1, typename T2> bool maxe(T1& A, const T2& B) { if(B>A) { A=B; return 1; } return 0; } template <typename T1, typename T2> bool mine(T1& A, const T2& B) { if(B<A) { A=B; return 1; } return 0; } class Nic{} nic; template <typename T> Nic operator<<(Nic, T) { return nic; } Nic operator<<(ostream&, Nic) { return nic; } ////////////////////////////////////////////////// using state = tuple<pii,pii,pii>; vi R; template <int a, int b> state pour(state s) { int x = min(get<a>(s).f, get<b>(s).s - get<b>(s).f); get<a>(s).f -= x; get<b>(s).f += x; return s; } vector<state> moves(state s) { return {pour<0,1>(s), pour<0,2>(s), pour<1,0>(s), pour<1,2>(s), pour<2,0>(s), pour<2,1>(s)}; } void bfs(state s) { queue<pair<state,int>> Q; set<state> vis; Q.emplace(s,0); vis.insert(s); while (!Q.empty()) { auto [v,d] = Q.front(); Q.pop(); mine(R[get<0>(v).f], d); mine(R[get<1>(v).f], d); mine(R[get<2>(v).f], d); for (state u : moves(v)) if (vis.find(u) == vis.end()) { vis.emplace(u); Q.emplace(u,d+1); } } } auto solve() { pii A, B, C; cin >> A.s >> B.s >> C.s; R.resize(C.s+1, INF); cin >> A.f >> B.f >> C.f; bfs({A,B,C}); rep(i, 0, C.s) cout << (R[i] == INF ? -1 : R[i]) << ' '; cout << endl; return nic; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int noOfTests = 1; //cin >> noOfTests; while(noOfTests --> 0) cout << solve() << '\n'; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #ifdef NDEBUG #undef LOCAL #endif #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using ll = long long; using ull = unsigned long long; using ld = long double; using pii = pair<int,int>; using pll = pair<ll,ll>; using vi = vector<int>; using vb = vector<bool>; using vc = vector<char>; using vvc = vector<vc>; using vvi = vector<vi>; using vvb = vector<vb>; using vpii = vector<pii>; using vpll = vector<pll>; using vll = vector<ll>; using vull = vector<ull>; using vvll = vector<vll>; using namespace __gnu_pbds; template <typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #define f first #define s second #define pb emplace_back #define rep(i, begin, end) for(auto i = (begin); i <= (end); ++i) #define repr(i, begin, end) for(auto i = (begin); i >= (end); --i) #define bend(X) X.begin(), X.end() constexpr int INF = 1e9+1e7; constexpr ll INFl = INF; constexpr ll INFll = 1e18+1e16; #ifndef LOCAL #define endl '\n' #endif template <typename T> void print(T x) { cout << x << endl; } template <typename T, typename... Args> void print(T x, Args... args) { cout << x << ' '; print(args...); } #ifdef LOCAL template <typename T> void _deb(T x) { cout << x << endl; } template <typename T, typename... Args> void _deb(T x, Args... args) { cout << x << ", "; _deb(args...); } #define deb(...) do { cout << #__VA_ARGS__ << " = "; _deb(__VA_ARGS__); } while (false) #define say(...) print(__VA_ARGS__); template <typename T1, typename T2> ostream& operator<<(ostream& os, pair<T1,T2> x) { os << '(' << x.f << ", " << x.s << ')'; return os; } template <typename Ch, typename Tr, typename T> ostream& operator<<(basic_ostream<Ch,Tr>& os, T x) { bool first = true; os << '['; for(auto i : x) { if (!first) os << ", "; os << i; first = false; } os << ']'; return os; } #else #define deb(...) #define say(...) template <typename T1, typename T2> ostream& operator<<(ostream& os, pair<T1,T2> x) { os << x.f << ' ' << x.s; return os; } template <typename Ch, typename Tr, typename T> ostream& operator<<(basic_ostream<Ch,Tr>& os, T x) { for(auto i : x) os << i << ' '; return os; } #endif template <typename T1, typename T2> istream& operator>>(istream& is, pair<T1,T2>& x) { is >> x.f >> x.s; return is; } template <typename T> istream& operator>>(istream& is, vector<T>& x) { for(T& i : x) is >> i; return is; } template <typename T1, typename T2> pair<T1,T2> operator+(const pair<T1,T2>& A, const pair<T1,T2>& B) { return {A.f+B.f, A.s+B.s}; } template <typename T1, typename T2> pair<T1,T2> operator-(const pair<T1,T2>& A, const pair<T1,T2>& B) { return {A.f-B.f, A.s-B.s}; } template <typename T1, typename T2> pair<T1,T2>& operator+=(pair<T1,T2>& A, const pair<T1,T2>& B) { A.f += B.f; A.s += B.s; return A; } template <typename T1, typename T2> pair<T1,T2>& operator-=(pair<T1,T2>& A, const pair<T1,T2>& B) { A.f -= B.f; A.s -= B.s; return A; } template <typename T1, typename T2> pair<T1,T2> operator-(const pair<T1,T2>& A) { return {-A.f, -A.s}; } template <typename T1, typename T2> bool maxe(T1& A, const T2& B) { if(B>A) { A=B; return 1; } return 0; } template <typename T1, typename T2> bool mine(T1& A, const T2& B) { if(B<A) { A=B; return 1; } return 0; } class Nic{} nic; template <typename T> Nic operator<<(Nic, T) { return nic; } Nic operator<<(ostream&, Nic) { return nic; } ////////////////////////////////////////////////// using state = tuple<pii,pii,pii>; vi R; template <int a, int b> state pour(state s) { int x = min(get<a>(s).f, get<b>(s).s - get<b>(s).f); get<a>(s).f -= x; get<b>(s).f += x; return s; } vector<state> moves(state s) { return {pour<0,1>(s), pour<0,2>(s), pour<1,0>(s), pour<1,2>(s), pour<2,0>(s), pour<2,1>(s)}; } void bfs(state s) { queue<pair<state,int>> Q; set<state> vis; Q.emplace(s,0); vis.insert(s); while (!Q.empty()) { auto [v,d] = Q.front(); Q.pop(); mine(R[get<0>(v).f], d); mine(R[get<1>(v).f], d); mine(R[get<2>(v).f], d); for (state u : moves(v)) if (vis.find(u) == vis.end()) { vis.emplace(u); Q.emplace(u,d+1); } } } auto solve() { pii A, B, C; cin >> A.s >> B.s >> C.s; R.resize(C.s+1, INF); cin >> A.f >> B.f >> C.f; bfs({A,B,C}); rep(i, 0, C.s) cout << (R[i] == INF ? -1 : R[i]) << ' '; cout << endl; return nic; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int noOfTests = 1; //cin >> noOfTests; while(noOfTests --> 0) cout << solve() << '\n'; return 0; } |