#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]; vector > D; set S; 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; } void matchingSolution() { 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++; } } 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"); } 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]); D.push_back(make_pair(A[i], i)); } for(int i = 0; i < M; i++) scanf("%d", &B[i]); sort(B, B + M); M = unique(B, B + M) - B; sort(D.begin(), D.end()); int ans = 0; for(int i = 0; i < N; i++) { bool ok = false; for(int j = M - 1; j >= 0 && !ok; j--) if(S.count(D[i].first - B[j]) == 0) { ans++; A[D[i].second] -= B[j]; S.insert(A[D[i].second]); ok = true; } if(!ok && S.count(D[i].first) == 0) { ans++; S.insert(D[i].first); } } printf("%d\n", ans); for(int i = 0; i < N; i++) { if(i > 0) printf(" "); printf("%d", A[i]); } printf("\n"); return 0; }