感觉 F 有点神奇,不会做(别是斜率优化这类的就行 qwq)
G 貌似是判无解挂了……
#include <bits/stdc++.h>
using namespace std;
const int N = 305;
const double eps = 1e-9;
int n, mat[N], v1[N], v2[N];
double xp[N], yp[N], xq[N], yq[N], lx[N], ly[N], d[N][N];
bool check(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
if (max(ax1, ax2) >= min(bx1, bx2) && min(ax1, ax2) <= max(bx1, bx2) && max(ay1, ay2) >= min(by1, by2) && min(ay1, ay2) <= max(by1, by2)) {
if (1ll * ((bx1 - ax1) * (ay2 - ay1) - (by1 - ay1) * (ax2 - ax1)) * ((bx2 - ax1) * (ay2 - ay1) - (by2 - ay1) * (ax2 - ax1)) <= 0 && 1ll * ((ax1 - bx1) * (by2 - by1) - (ay1 - by1) * (bx2 - bx1)) * ((ax2 - bx1) * (by2 - by1) - (ay2 - by1) * (bx2 - bx1)) <= 0) return 1;
}
return 0;
}
#define sq(x) ((x) * (x))
int dfs(int x) {
v1[x] = 1;
for (int y = 1; y <= n; y++) {
if (!v2[y] && fabs(lx[x] + ly[y] - d[x][y]) < eps) {
v2[y] = 1;
if (!mat[y] || dfs(mat[y])) return mat[y] = x, 1;
}
}
return 0;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) cin >> xp[i] >> yp[i];
for (int i = 1; i <= n; i++) cin >> xq[i] >> yq[i];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) d[j][i] = -sqrt(sq(xp[i] - xq[j]) + sq(yp[i] - yq[j]));
}
for (int p = 1; p <= n; p++) {
while (1) {
memset(v1, 0, sizeof(v1));
memset(v2, 0, sizeof(v2));
if (dfs(p)) break;
double dd = 1e10;
for (int i = 1; i <= n; i++) {
if (v1[i]) {
for (int j = 1; j <= n; j++) {
if (!v2[j]) dd = min(dd, lx[i] + ly[j] - d[i][j]);
}
}
}
for (int i = 1; i <= n; i++) {
if (v1[i]) lx[i] -= dd;
if (v2[i]) ly[i] += dd;
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
if (check(xp[i], yp[i], xq[mat[i]], yq[mat[i]], xp[j], yp[j], xq[mat[j]], yq[mat[j]])) { cout << -1; return 0; }
}
}
for (int i = 1; i <= n; i++) cout << mat[i] << ' ';
}