#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <unordered_set>
using namespace std;
typedef unsigned long long ull;
typedef unsigned int ui;
const int MAXN = 100100;
unordered_set<ull> s;
queue<pair<ui, ull>> q;
ui x, y, z;
int wyn[MAXN] = {};
ull sum;
struct PK {
ui a, b, c;
PK(ui a, ui b, ui c): a{a}, b{b}, c{c} {};
};
inline ull pack(ui a, ui b) {
return ((((ull)a) << 32LL) + (ull) b);
}
void push(ui ln, ui a, ui b) {
q.push(make_pair(ln, pack(a, b)));
}
pair<ui, PK> get() {
pair<ui, ull> f = q.front();
q.pop();
ui fst = (f.second >> 32LL);
ui z = sum - fst - f.second;
return make_pair(f.first, PK(fst, (ui) f.second, z));
}
void add(ui a, ui b) {
s.insert(pack(a,b));
}
bool find(ui a, ui b) {
return s.find(pack(a, b)) != s.end();
}
int main() {
ui a, b, c;
cin >> x >> y >> z >> a >> b >> c;
sum = a + b + c;
for (int i = 0; i <= z; i++) {
wyn[i] = -1;
}
wyn[a] = 0;
wyn[b] = 0;
wyn[c] = 0;
push(0, a, b);
add(a, b);
// PK x = get();
// cout << x.a << ' ' << x.b << ' ' << x.c << endl;
while(!q.empty()) {
pair<ui, PK> pw = get();
PK w = pw.second;
ui ct = pw.first;
// cout << w.a << ' ' << w.b << ' ' << w.c << endl;
// cout << ct << endl;
ui pab = min(y-w.b, w.a);
// cout << "ponc" << endl;
if (wyn[w.b+pab] == -1) {
wyn[w.b+pab] = ct+1;
}
if (wyn[w.a-pab] == -1) {
wyn[w.a-pab] = ct+1;
}
if(!find(w.a-pab, w.b+pab)) {
// cout << "pab: " << w.a-pab << " " << w.b+pab << " " << w.c << endl;
push(ct+1, w.a-pab, w.b+pab);
add(w.a-pab, w.b+pab);
}
ui pba = min(x-w.a, w.b);
if (wyn[w.a+pba] == -1) {
wyn[w.a+pba] = ct+1;
}
if (wyn[w.b-pba] == -1) {
wyn[w.b-pba] = ct+1;
}
if(!find(w.a+pba, w.b-pba)) {
// cout << "pba: " << w.a+pba << " " << w.b+pba << " " << w.c << endl;
push(ct+1, w.a+pba, w.b-pba);
add(w.a+pba, w.b-pba);
}
ui pac = min(z-w.c, w.a);
// cout << "pac: " << pac << endl;
if (wyn[w.c+pac] == -1) {
wyn[w.c+pac] = ct+1;
}
if (wyn[w.a-pac] == -1) {
wyn[w.a-pac] = ct+1;
}
if(!find(w.a-pac, w.b)) {
// cout << "pac: " << w.a-pac << " " << w.b << " " << w.c+pac << endl;
push(ct+1, w.a-pac, w.b);
add(w.a-pac, w.b);
}
ui pbc = min(z-w.c, w.b);
// cout << "pbc: " << pbc << endl;
if (wyn[w.c+pbc] == -1) {
wyn[w.c+pbc] = ct+1;
}
if (wyn[w.b-pbc] == -1) {
wyn[w.b-pbc] = ct+1;
}
if(!find(w.a, w.b-pbc)) {
// cout << "pbc: " << w.a << " " << w.b-pbc << " " << w.c+pbc << endl;
push(ct+1, w.a, w.b-pbc);
add(w.a, w.b-pbc);
}
// cout << "fromc" << endl;
ui pca = min(x-w.a, w.c);
if (wyn[w.c-pca] == -1) {
wyn[w.c-pca] = ct+1;
}
if (wyn[w.a+pca] == -1) {
wyn[w.a+pca] = ct+1;
}
if(!find(w.a+pca, w.b)) {
// cout << "pca: " << w.a+pca << " " << w.b << " " << w.c-pca << endl;
push(ct+1, w.a+pca, w.b);
add(w.a+pca, w.b);
}
ui pcb = min(y-w.b, w.c);
if (wyn[w.c-pcb] == -1) {
wyn[w.c-pcb] = ct+1;
}
if (wyn[w.b+pcb] == -1) {
wyn[w.b+pcb] = ct+1;
}
if(!find(w.a, w.b+pcb)) {
// cout << "pcb: " << w.a << " " << w.b+pcb << " " << w.c-pcb << endl;
push(ct+1, w.a, w.b+pcb);
add(w.a, w.b+pcb);
}
// cout << "kąc" << endl;
}
for(int i = 0; i <= z; i++) {
cout << wyn[i] << ' ';
}
cout << endl;
}
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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | #include <iostream> #include <vector> #include <string> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <unordered_set> using namespace std; typedef unsigned long long ull; typedef unsigned int ui; const int MAXN = 100100; unordered_set<ull> s; queue<pair<ui, ull>> q; ui x, y, z; int wyn[MAXN] = {}; ull sum; struct PK { ui a, b, c; PK(ui a, ui b, ui c): a{a}, b{b}, c{c} {}; }; inline ull pack(ui a, ui b) { return ((((ull)a) << 32LL) + (ull) b); } void push(ui ln, ui a, ui b) { q.push(make_pair(ln, pack(a, b))); } pair<ui, PK> get() { pair<ui, ull> f = q.front(); q.pop(); ui fst = (f.second >> 32LL); ui z = sum - fst - f.second; return make_pair(f.first, PK(fst, (ui) f.second, z)); } void add(ui a, ui b) { s.insert(pack(a,b)); } bool find(ui a, ui b) { return s.find(pack(a, b)) != s.end(); } int main() { ui a, b, c; cin >> x >> y >> z >> a >> b >> c; sum = a + b + c; for (int i = 0; i <= z; i++) { wyn[i] = -1; } wyn[a] = 0; wyn[b] = 0; wyn[c] = 0; push(0, a, b); add(a, b); // PK x = get(); // cout << x.a << ' ' << x.b << ' ' << x.c << endl; while(!q.empty()) { pair<ui, PK> pw = get(); PK w = pw.second; ui ct = pw.first; // cout << w.a << ' ' << w.b << ' ' << w.c << endl; // cout << ct << endl; ui pab = min(y-w.b, w.a); // cout << "ponc" << endl; if (wyn[w.b+pab] == -1) { wyn[w.b+pab] = ct+1; } if (wyn[w.a-pab] == -1) { wyn[w.a-pab] = ct+1; } if(!find(w.a-pab, w.b+pab)) { // cout << "pab: " << w.a-pab << " " << w.b+pab << " " << w.c << endl; push(ct+1, w.a-pab, w.b+pab); add(w.a-pab, w.b+pab); } ui pba = min(x-w.a, w.b); if (wyn[w.a+pba] == -1) { wyn[w.a+pba] = ct+1; } if (wyn[w.b-pba] == -1) { wyn[w.b-pba] = ct+1; } if(!find(w.a+pba, w.b-pba)) { // cout << "pba: " << w.a+pba << " " << w.b+pba << " " << w.c << endl; push(ct+1, w.a+pba, w.b-pba); add(w.a+pba, w.b-pba); } ui pac = min(z-w.c, w.a); // cout << "pac: " << pac << endl; if (wyn[w.c+pac] == -1) { wyn[w.c+pac] = ct+1; } if (wyn[w.a-pac] == -1) { wyn[w.a-pac] = ct+1; } if(!find(w.a-pac, w.b)) { // cout << "pac: " << w.a-pac << " " << w.b << " " << w.c+pac << endl; push(ct+1, w.a-pac, w.b); add(w.a-pac, w.b); } ui pbc = min(z-w.c, w.b); // cout << "pbc: " << pbc << endl; if (wyn[w.c+pbc] == -1) { wyn[w.c+pbc] = ct+1; } if (wyn[w.b-pbc] == -1) { wyn[w.b-pbc] = ct+1; } if(!find(w.a, w.b-pbc)) { // cout << "pbc: " << w.a << " " << w.b-pbc << " " << w.c+pbc << endl; push(ct+1, w.a, w.b-pbc); add(w.a, w.b-pbc); } // cout << "fromc" << endl; ui pca = min(x-w.a, w.c); if (wyn[w.c-pca] == -1) { wyn[w.c-pca] = ct+1; } if (wyn[w.a+pca] == -1) { wyn[w.a+pca] = ct+1; } if(!find(w.a+pca, w.b)) { // cout << "pca: " << w.a+pca << " " << w.b << " " << w.c-pca << endl; push(ct+1, w.a+pca, w.b); add(w.a+pca, w.b); } ui pcb = min(y-w.b, w.c); if (wyn[w.c-pcb] == -1) { wyn[w.c-pcb] = ct+1; } if (wyn[w.b+pcb] == -1) { wyn[w.b+pcb] = ct+1; } if(!find(w.a, w.b+pcb)) { // cout << "pcb: " << w.a << " " << w.b+pcb << " " << w.c-pcb << endl; push(ct+1, w.a, w.b+pcb); add(w.a, w.b+pcb); } // cout << "kąc" << endl; } for(int i = 0; i <= z; i++) { cout << wyn[i] << ' '; } cout << endl; } |
English