//Code by Patcas Csaba #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define LL long long #define PII pair #define VB vector #define VI vector #define VD vector #define VS vector #define VPII vector > #define VVI vector < VI > #define VVB vector < VB > #define FORN(i, n) for(int i = 0; i < (n); ++i) #define FOR(i, a, b) for(int i = (a); i <= (b); ++i) #define FORD(i, a, b) for(int i = (a); i >= (b); --i) #define REPEAT do{ #define UNTIL(x) }while(!(x)); #define SZ size() #define BG begin() #define EN end() #define CL clear() #define X first #define Y second #define RS resize #define PB push_back #define MP make_pair #define ALL(x) x.begin(), x.end() #define IN_FILE "a.in" #define OUT_FILE "a.out" FILE *stream1, *stream2; int n, m, nrNodes, matchSize = 0; VI a, b, paired; map iNode, value; VVI g; VB was; bool found; void addEdge(int node1, int node2) { g[node1].PB(node2); } void pairUp(int node) { FORN(i, g[node].SZ) { int aux = g[node][i]; if (paired[aux] == -1) { paired[node] = aux; paired[aux] = node; found = true; return; } } was[node] = true; FORN(i, g[node].SZ) { int aux = g[node][i]; if (!was[aux]) { was[aux] = true; pairUp(paired[aux]); if (found) { paired[node] = aux; paired[aux] = node; return; } } } } int main() { //Read data //freopen_s(&stream1, IN_FILE, "r", stdin); //freopen_s(&stream2, OUT_FILE, "w", stdout); cin >> n >> m; a.RS(n + 1); b.RS(m + 1); FOR(i, 1, n) cin >> a[i]; FOR(i, 1, m) cin >> b[i]; g.RS(n + 1); nrNodes = n; //Solve FOR(i, 1, n) { int aux = a[i]; if (iNode.count(aux)) addEdge(i, iNode[aux]); else { ++nrNodes; iNode[aux] = nrNodes; value[nrNodes] = aux; addEdge(i, nrNodes); } FOR(j, 1, m) { aux = a[i] - b[j]; if (iNode.count(aux)) addEdge(i, iNode[aux]); else { ++nrNodes; iNode[aux] = nrNodes; value[nrNodes] = aux; addEdge(i, nrNodes); } } } paired.RS(nrNodes + 1, -1); was.RS(nrNodes + 1); FOR(i, 1, n) if (paired[i] == -1) { fill(ALL(was), false); found = false; pairUp(i); if (found) ++matchSize; } //Write data cout << matchSize << endl; FOR(i, 1, n) if (paired[i] == -1) cout << a[i] << " "; else cout << value[paired[i]] << " "; return 0; }