How F/求条 G
  • 板块灌水区
  • 楼主WorldMachine
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/9/28 21:42
  • 上次更新2024/9/29 10:58:48
查看原帖
How F/求条 G
879904
WorldMachine楼主2024/9/28 21:42

感觉 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] << ' ';
}
2024/9/28 21:42
加载中...