题解:
把算式和对应的数连边,跑二分图匹配。
要先离散化一下数字,或者用map。
复杂度:
时间复杂度:O(二分图匹配),hungary是O(nm)。
空间复杂度:O(n + m)。
1A。
GET:
有算式,有数字,要连接起来,且不相同,那么就是匹配。
/* Telekinetic Forest Guard */
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 2505, maxnode = 20005, maxm = 50005;
int n, head[maxnode], cnt, A[maxn], B[maxn], tot, from[maxnode], to[maxnode], vis[maxnode], clo;
LL disc[maxn * 3];
struct _edge {
int v, next;
} g[maxm << 1];
inline int iread() {
int f = 1, x = 0; char ch = getchar();
for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return f * x;
}
inline void add(int u, int v) {
g[cnt] = (_edge){v, head[u]};
head[u] = cnt++;
}
inline int find(LL x) {
int l = 1, r = tot;
while(l <= r) {
int mid = l + r >> 1;
if(disc[mid] < x) l = mid + 1;
else if(disc[mid] == x) return mid;
else r = mid - 1;
}
}
inline bool hungary(int x) {
vis[x] = clo;
for(int i = head[x]; ~i; i = g[i].next) if(vis[g[i].v] != clo) {
vis[g[i].v] = clo;
if(!from[g[i].v] || hungary(from[g[i].v])) {
from[g[i].v] = x;
to[x] = g[i].v;
return 1;
}
}
return 0;
}
int main() {
n = iread();
for(int i = 1; i <= n; i++) {
A[i] = iread(), B[i] = iread();
disc[++tot] = A[i] + B[i];
disc[++tot] = A[i] - B[i];
disc[++tot] = (LL)A[i] * B[i];
}
sort(disc + 1, disc + 1 + tot);
tot = unique(disc + 1, disc + 1 + tot) - (disc + 1);
if(tot < n) {
printf("impossible\n");
return 0;
}
for(int i = n + tot; i; i--) head[i] = -1; cnt = 0;
for(int i = 1; i <= n; i++) {
add(i, n + find(A[i] + B[i]));
add(i, n + find(A[i] - B[i]));
add(i, n + find((LL)A[i] * B[i]));
}
int ans = 0;
for(int i = 1; i <= n; i++) clo++, ans += hungary(i);
if(ans < n) {
printf("impossible\n");
return 0;
}
for(int i = 1; i <= n; i++) {
LL num = disc[to[i] - n];
if(A[i] + B[i] == num) printf("%d + %d = %lld\n", A[i], B[i], num);
else if(A[i] - B[i] == num) printf("%d - %d = %lld\n", A[i], B[i], num);
else if((LL)A[i] * B[i] == num) printf("%d * %d = %lld\n", A[i], B[i], num);
}
return 0;
}