#include <iostream> #include <unordered_set> #include <queue> #include <algorithm> using namespace std; typedef long long ll; #define MAX 100100 #define BIG 1100100100 #define D(x) unordered_set<ll> used; int res[MAX], ww = 0; struct But { int a,b,c; int op; }; queue<But> bb; void add(But b) { ll h = (ll(b.a)<<17) | (ll(b.a)<<34) | ll(b.c); auto it = used.find(h); if(it == used.end()) { used.insert(h); bb.push(b); D(cout << "added: " << b.a << "," << b.b << "," << b.c << " op:" << b.op << " ww:" << ww << "\n"); if(res[b.a] > b.op) { res[b.a] = b.op; ww++;} if(res[b.b] > b.op) { res[b.b] = b.op; ww++;} if(res[b.c] > b.op) { res[b.c] = b.op; ww++;} } } void pour(int &x, int X, int &y, int Y, int &op) { int v = min(Y-y, x); x-=v; y+=v; op++; } int main() { int A,B,C,a,b,c; cin >> A >> B >> C >> a >> b >> c; for(int i=0;i<=C+1;i++) res[i] = BIG; add(But{a,b,c,0}); while(!bb.empty()) { But b = bb.front(); bb.pop(); { But n = b; pour(n.a,A,n.b,B, n.op); add(n); } { But n = b; pour(n.a,A,n.c,C, n.op); add(n); } { But n = b; pour(n.b,B,n.a,A, n.op); add(n); } { But n = b; pour(n.b,B,n.c,C, n.op); add(n); } { But n = b; pour(n.c,C,n.a,A, n.op); add(n); } { But n = b; pour(n.c,C,n.b,B, n.op); add(n); } } for(int i=0;i<C+1;i++) printf("%d ", res[i] < BIG? res[i]: -1); printf("\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 | #include <iostream> #include <unordered_set> #include <queue> #include <algorithm> using namespace std; typedef long long ll; #define MAX 100100 #define BIG 1100100100 #define D(x) unordered_set<ll> used; int res[MAX], ww = 0; struct But { int a,b,c; int op; }; queue<But> bb; void add(But b) { ll h = (ll(b.a)<<17) | (ll(b.a)<<34) | ll(b.c); auto it = used.find(h); if(it == used.end()) { used.insert(h); bb.push(b); D(cout << "added: " << b.a << "," << b.b << "," << b.c << " op:" << b.op << " ww:" << ww << "\n"); if(res[b.a] > b.op) { res[b.a] = b.op; ww++;} if(res[b.b] > b.op) { res[b.b] = b.op; ww++;} if(res[b.c] > b.op) { res[b.c] = b.op; ww++;} } } void pour(int &x, int X, int &y, int Y, int &op) { int v = min(Y-y, x); x-=v; y+=v; op++; } int main() { int A,B,C,a,b,c; cin >> A >> B >> C >> a >> b >> c; for(int i=0;i<=C+1;i++) res[i] = BIG; add(But{a,b,c,0}); while(!bb.empty()) { But b = bb.front(); bb.pop(); { But n = b; pour(n.a,A,n.b,B, n.op); add(n); } { But n = b; pour(n.a,A,n.c,C, n.op); add(n); } { But n = b; pour(n.b,B,n.a,A, n.op); add(n); } { But n = b; pour(n.b,B,n.c,C, n.op); add(n); } { But n = b; pour(n.c,C,n.a,A, n.op); add(n); } { But n = b; pour(n.c,C,n.b,B, n.op); add(n); } } for(int i=0;i<C+1;i++) printf("%d ", res[i] < BIG? res[i]: -1); printf("\n"); } |