#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
const int N=2*3*1e5;
const int INF=1e9+7;
int A,B,C;
int n=0;
map<tuple<int,int,int>,int> mp;
tuple<int,int,int> ver[N+10];
int d[N+10];
int ans[N+10];
bool vis[N+10];
queue<int> que;
bool ok(int a,int b,int c)
{
return (a>=0 && b>=0 && c>=0 && a<=A && b<=B && c<=C);
}
void add(int a,int b,int c)
{
if(ok(a,b,c) && mp.find({a,b,c})==mp.end())
{
n++;
mp[make_tuple(a,b,c)]=n;
ver[n]=make_tuple(a,b,c);
}
return;
}
vector<int> gen_e(int a,int b,int c)
{
vector<int> vec;
auto add_ver=[&vec](int x,int y,int z)
{
//cerr<<x<<" "<<y<<" "<<z<<"\n";
if(ok(x,y,z))
vec.push_back(mp[make_tuple(x,y,z)]);
return;
};
int T[3]={A,B,C};
auto mv=[&](int x,int y)
{
int t[3]={a,b,c};
int dd=min(t[x],T[y]-t[y]);
t[x]-=dd;
t[y]+=dd;
add_ver(t[0],t[1],t[2]);
return;
};
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
mv(i,j);
}
//cerr<<a<<" "<<b<<" "<<c<<"\n";
//for(auto v:vec)
//{
// auto [a1,a2,a3]=ver[v];
// cerr<<a1<<" "<<a2<<" "<<a3<<"\n";
//}
//cerr<<"\n";
return vec;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int a,b,c;
cin>>A>>B>>C;
cin>>a>>b>>c;
int s=a+b+c;
add(a,b,c);
for(int i=0;i<=C;i++)
{
add(0,i,s-i);
add(A,i,s-i-A);
add(i,0,s-i);
add(i,B,s-i-B);
add(i,s-i,0);
add(i,s-i-C,C);
ans[i]=INF;
}
vis[1]=true;
d[1]=0;
que.push(1);
while(!que.empty())
{
int x=que.front();
que.pop();
auto [a1,a2,a3]=ver[x];
auto e=gen_e(a1,a2,a3);
for(auto v:e)
{
if(!vis[v])
{
vis[v]=true;
d[v]=d[x]+1;
que.push(v);
}
}
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
continue;
auto [a1,a2,a3]=ver[i];
for(auto j:{a1,a2,a3})
ans[j]=min(ans[j],d[i]);
}
for(int i=0;i<=C;i++)
cout<<(ans[i]==INF ? -1:ans[i])<<" ";
cout<<"\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 | #include<bits/stdc++.h> #define fi first #define se second using namespace std; const int N=2*3*1e5; const int INF=1e9+7; int A,B,C; int n=0; map<tuple<int,int,int>,int> mp; tuple<int,int,int> ver[N+10]; int d[N+10]; int ans[N+10]; bool vis[N+10]; queue<int> que; bool ok(int a,int b,int c) { return (a>=0 && b>=0 && c>=0 && a<=A && b<=B && c<=C); } void add(int a,int b,int c) { if(ok(a,b,c) && mp.find({a,b,c})==mp.end()) { n++; mp[make_tuple(a,b,c)]=n; ver[n]=make_tuple(a,b,c); } return; } vector<int> gen_e(int a,int b,int c) { vector<int> vec; auto add_ver=[&vec](int x,int y,int z) { //cerr<<x<<" "<<y<<" "<<z<<"\n"; if(ok(x,y,z)) vec.push_back(mp[make_tuple(x,y,z)]); return; }; int T[3]={A,B,C}; auto mv=[&](int x,int y) { int t[3]={a,b,c}; int dd=min(t[x],T[y]-t[y]); t[x]-=dd; t[y]+=dd; add_ver(t[0],t[1],t[2]); return; }; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) mv(i,j); } //cerr<<a<<" "<<b<<" "<<c<<"\n"; //for(auto v:vec) //{ // auto [a1,a2,a3]=ver[v]; // cerr<<a1<<" "<<a2<<" "<<a3<<"\n"; //} //cerr<<"\n"; return vec; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int a,b,c; cin>>A>>B>>C; cin>>a>>b>>c; int s=a+b+c; add(a,b,c); for(int i=0;i<=C;i++) { add(0,i,s-i); add(A,i,s-i-A); add(i,0,s-i); add(i,B,s-i-B); add(i,s-i,0); add(i,s-i-C,C); ans[i]=INF; } vis[1]=true; d[1]=0; que.push(1); while(!que.empty()) { int x=que.front(); que.pop(); auto [a1,a2,a3]=ver[x]; auto e=gen_e(a1,a2,a3); for(auto v:e) { if(!vis[v]) { vis[v]=true; d[v]=d[x]+1; que.push(v); } } } for(int i=1;i<=n;i++) { if(!vis[i]) continue; auto [a1,a2,a3]=ver[i]; for(auto j:{a1,a2,a3}) ans[j]=min(ans[j],d[i]); } for(int i=0;i<=C;i++) cout<<(ans[i]==INF ? -1:ans[i])<<" "; cout<<"\n"; return 0; } |
English