#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define MAXN 1024 int N, M; int A[MAXN]; int B[MAXN]; vector C; vector G[MAXN]; bool v[MAXN]; int st[MAXN * MAXN], dr[MAXN * MAXN]; bool pairup(int node) { if(v[node]) return false; v[node] = true; for(vector :: iterator it = G[node].begin(); it != G[node].end(); it++) if(st[*it] == -1) { st[*it] = node; dr[node] = *it; return true; } for(vector :: iterator it = G[node].begin(); it != G[node].end(); it++) if(pairup(st[*it])) { st[*it] = node; dr[node] = *it; return true; } return false; } int main() { // freopen("date.in", "r", stdin); // freopen("date.out","w", stdout); scanf("%d %d", &N, &M); for(int i = 0; i < N; i++) scanf("%d", &A[i]); for(int i = 0; i < M; i++) scanf("%d", &B[i]); for(int i = 0; i < N; i++) { C.push_back(A[i]); for(int j = 0; j < M; j++) C.push_back(A[i] - B[j]); } sort(C.begin(), C.end()); C.resize(unique(C.begin(), C.end()) - C.begin()); for(int i = 0; i < N; i++) { G[i].push_back( lower_bound(C.begin(), C.end(), A[i]) - C.begin() ); for(int j = 0; j < M; j++) G[i].push_back( lower_bound(C.begin(), C.end(), A[i] - B[j]) - C.begin() ); } int dim = max(N, (int)C.size()); for(int i = 0; i < dim; i++) { st[i] = dr[i] = -1; } bool ok = false; int match = 0; while(!ok) { ok = true; memset(v, false, sizeof(v)); for(int i = 0; i < N; i++) if(dr[i] == -1 && pairup(i)) { ok = false; match++; } } // bool first = true; // for(int i = 0; i < (int)C.size(); i++) // if(st[i] != -1) { // if(!first) // printf(" "); // first = false; // printf("%d", C[i]); // } // printf("\n"); printf("%d\n", match); for(int i = 0; i < N; i++) { int crt; if(dr[i] == -1) crt = A[i]; else crt = C[dr[i]]; if(i > 0) printf(" "); printf("%d", crt); } printf("\n"); return 0; }