// {{{ #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define FOR(i, b, e) for (int i = (b); i <= (e); i++) #define FORD(i, b, e) for (int i = (e); i >= (b); i--) #define MP make_pair #define FS first #define ND second #define PB push_back #define ALL(x) x.begin(), x.end() using namespace std; using LL = long long; using LD = long double; using PII = pair<int,int>; using PLL = pair<LL,LL>; using PLD = pair<LD,LD>; using VI = vector<int>; using VLL = vector<LL>; using VLD = vector<LD>; using VB = vector<bool>; using VS = vector<string>; template<class T> using V = vector<T>; template<class T1, class T2> using P = pair<T1,T2>; template<class T,class Comp=greater<T>> using PQ = priority_queue<T,V<T>,Comp>; template<class T> int sz(const T& a) { return (int)a.size(); } template<class T> void amin(T& a, T b) { a = min(a, b); } template<class T> void amax(T& a, T b) { a = max(a, b); } /* const size_t rseed = std::chrono::high_resolution_clock::now().time_since_epoch().count(); mt19937 rnd(rseed); template<class T> T randint(T lo, T hi) { return uniform_int_distribution<T>{lo,hi}(rnd); } */ /* find_by_order(k) - k'th largest counting from 0; order_of_key(k) - number of items strictly smaller than k; join(other), split(k, other) - all keys in other greater than in *(this). */ template<class K,class V,class Comp=less<K>> using ordered_map = __gnu_pbds::tree<K,V,Comp, __gnu_pbds::rb_tree_tag,__gnu_pbds::tree_order_statistics_node_update>; template<class T,class Comp=less<T>> using ordered_set = ordered_map<T,__gnu_pbds::null_type,Comp>; const int inf = 1e9 + 1; const LL infl = 1e18 + 1; void solve(); // }}} int main() { int t = 1; // scanf("%d", &t); FOR(i, 1, t) { // printf("Case #%d: ", i); solve(); } } using S = array<int,3>; set<S> vis; queue<P<S,int>> qq; int ans[int(1e5) + 1]; void solve() { S mx, s0; FOR(i, 0, 2) scanf("%d", &mx[i]); FOR(i, 0, 2) scanf("%d", &s0[i]); FOR(i, 0, mx[2]) ans[i] = inf; vis.insert(s0); qq.push(MP(s0, 0)); while (sz(qq)) { auto [s, d] = qq.front(); qq.pop(); FOR(i, 0, 2) amin(ans[s[i]], d); FOR(i, 0, 2) FOR(j, 0, 2) if (i != j) { S s1 = s; int x = min(s1[i], mx[j] - s1[j]); s1[i] -= x; s1[j] += x; if (!vis.count(s1)) { vis.insert(s1); qq.push(MP(s1, d + 1)); } } } FOR(i, 0, mx[2]) printf("%d ", ans[i] == inf ? -1 : ans[i]); putchar('\n'); }
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 | // {{{ #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define FOR(i, b, e) for (int i = (b); i <= (e); i++) #define FORD(i, b, e) for (int i = (e); i >= (b); i--) #define MP make_pair #define FS first #define ND second #define PB push_back #define ALL(x) x.begin(), x.end() using namespace std; using LL = long long; using LD = long double; using PII = pair<int,int>; using PLL = pair<LL,LL>; using PLD = pair<LD,LD>; using VI = vector<int>; using VLL = vector<LL>; using VLD = vector<LD>; using VB = vector<bool>; using VS = vector<string>; template<class T> using V = vector<T>; template<class T1, class T2> using P = pair<T1,T2>; template<class T,class Comp=greater<T>> using PQ = priority_queue<T,V<T>,Comp>; template<class T> int sz(const T& a) { return (int)a.size(); } template<class T> void amin(T& a, T b) { a = min(a, b); } template<class T> void amax(T& a, T b) { a = max(a, b); } /* const size_t rseed = std::chrono::high_resolution_clock::now().time_since_epoch().count(); mt19937 rnd(rseed); template<class T> T randint(T lo, T hi) { return uniform_int_distribution<T>{lo,hi}(rnd); } */ /* find_by_order(k) - k'th largest counting from 0; order_of_key(k) - number of items strictly smaller than k; join(other), split(k, other) - all keys in other greater than in *(this). */ template<class K,class V,class Comp=less<K>> using ordered_map = __gnu_pbds::tree<K,V,Comp, __gnu_pbds::rb_tree_tag,__gnu_pbds::tree_order_statistics_node_update>; template<class T,class Comp=less<T>> using ordered_set = ordered_map<T,__gnu_pbds::null_type,Comp>; const int inf = 1e9 + 1; const LL infl = 1e18 + 1; void solve(); // }}} int main() { int t = 1; // scanf("%d", &t); FOR(i, 1, t) { // printf("Case #%d: ", i); solve(); } } using S = array<int,3>; set<S> vis; queue<P<S,int>> qq; int ans[int(1e5) + 1]; void solve() { S mx, s0; FOR(i, 0, 2) scanf("%d", &mx[i]); FOR(i, 0, 2) scanf("%d", &s0[i]); FOR(i, 0, mx[2]) ans[i] = inf; vis.insert(s0); qq.push(MP(s0, 0)); while (sz(qq)) { auto [s, d] = qq.front(); qq.pop(); FOR(i, 0, 2) amin(ans[s[i]], d); FOR(i, 0, 2) FOR(j, 0, 2) if (i != j) { S s1 = s; int x = min(s1[i], mx[j] - s1[j]); s1[i] -= x; s1[j] += x; if (!vis.count(s1)) { vis.insert(s1); qq.push(MP(s1, d + 1)); } } } FOR(i, 0, mx[2]) printf("%d ", ans[i] == inf ? -1 : ans[i]); putchar('\n'); } |