QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#455266#1945. Finding Pollyprostoegor239#WA 455ms6540kbC++144.0kb2024-06-26 04:29:462024-06-26 04:29:47

Judging History

This is the latest submission verdict.

  • [2024-06-26 04:29:47]
  • Judged
  • Verdict: WA
  • Time: 455ms
  • Memory: 6540kb
  • [2024-06-26 04:29:46]
  • Submitted

answer

#include <iostream>
#include <vector>
#include <math.h>

using namespace std;
using ll = long long;
using ld = long double;

ld eps = 1e-5;

const int N = 12;



struct point {
	ld x;
	ld y;
	point() {}

	point(ld x0, ld y0) {
		x = x0;
		y = y0;
	}

};


struct line {
	ld A;
	ld B;
	ld C;
	line() {}

	line(ld A, ld B, ld C) {
		this->A = A;
		this->B = B;
		this->C = C;
	}

	line(point D, point E) {
		this->A = D.y - E.y;
		this->B = E.x - D.x;
		this->C = -(A * D.x + B * D.y);
	}

};

bool is_intersect(line l, line k) {
	return abs(l.A * k.B - l.B * k.A) > eps;
}


point intersect(line l, line k) {
	ld q = l.A * k.B - l.B * k.A;
	ld y = (l.C * k.A - l.A * k.C) / q;
	ld x = (l.B * k.C - l.C * k.B) / q;
	return point(x, y);
}


point inter[N][N];
bool is_inter[N][N];
bool mem[N][N][N][N][N][N];
bool lol[N][N][N];


bool is_on_segment(point A, point B, point Z) {
	if ((A.x - Z.x) * (Z.x - B.x) < -eps)
		return false;

	if ((A.y - Z.y) * (Z.y - B.y) < -eps)
		return false;
	return true;

}


bool segment_intersec(point A, point B, point C, point D) {
	line l = line(A, B);
	line k = line(C, D);
	if (!is_intersect(l, k))
		return false;
	point E = intersect(l, k);
	return (is_on_segment(A, B, E) && is_on_segment(C, D, E));
}


ld dist(point A, point B) {
	return sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y));
}


line all_lines[N];
int lines[N];
int lines_len = 0;
int points_len = 0;
point points[N];

ll kek(ll mask, int n) {
	if (mask == 0) {

		if (!lol[lines[n - 2]][lines[n - 1]][lines[0]])
			return 0;

		for (int i = 0; i + 2 <= n - 2; i++)
			if (mem[lines[n - 2]][lines[n - 1]][lines[0]][lines[i]]
				[lines[i + 1]][lines[i + 2]])
				return 0;

		if (!lol[lines[n - 1]][lines[n - 2]][lines[0]])
			return 0;

		for (int i = 0; i + 2 <= n - 1; i++)
			if (mem[lines[n - 1]][lines[0]][lines[1]][lines[i]]
				[lines[i + 1]][lines[i + 2]])
				return 0;

		return 1;

		
	}
	else {
		ll sum = 0;
		int k = lines_len;
		point A(-1, -1);
		
		for (int i = 0; i < n; i++) {
			if ((1 << i) & mask) {
				bool f = 1;
				if (k >= 2 && !lol[i][lines[k - 1]][lines[k - 2]])
					f = 0;

				for (int j = 0; j <= k - 4 && f; j++) {
					if (mem[lines[j]][lines[j + 1]][lines[j + 2]][lines[k - 2]][lines[k - 1]][i])
						f = 0;
				}
				if (f) {
					lines[lines_len] = i;
					lines_len++;
					
					sum += kek(mask - (1 << i), n);
					lines_len--;
				}
			}
		}
		
		return sum;
	}
}


int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		ll a, b, c, d;
		cin >> a >> b >> c >> d;
		point A = point(a, b);
		point B = point(c, d);
		line l = line(A, B);
		all_lines[i] = l;
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (i != j) {
				is_inter[i][j] = is_intersect(all_lines[i], all_lines[j]);
				if (is_inter[i][j])
					inter[i][j] = intersect(all_lines[i], all_lines[j]);
			}

		}
	}

	for (int i = 0; i < n * n * n * n * n * n; i++) {
		vector<int> id(6);
		int cur = i;
		for (int j = 0; j < 6; j++) {
			id[j] = cur % n;
			cur /= n;
		}

		if (!is_inter[id[0]][id[1]] || !is_inter[id[2]][id[1]]
			|| !is_inter[id[3]][id[4]] || !is_inter[id[4]][id[5]])
			mem[id[0]][id[1]][id[2]][id[3]][id[4]][id[5]] = 1;
		else {
			mem[id[0]][id[1]][id[2]][id[3]][id[4]][id[5]] =
				segment_intersec(inter[id[0]][id[1]], inter[id[2]][id[1]],
					inter[id[3]][id[4]], inter[id[4]][id[5]]);
		}
	}

	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			for (int k = 0; k < n; k++) {
				if (!is_inter[i][j] || !is_inter[j][k])
					lol[i][j][k] = 0;
				else
					lol[i][j][k] = (dist(inter[i][j], inter[j][k]) > eps);
			}

	lines[0] = 0;
	lines_len = 1;

	ll mask = (1 << n) - 1 - 1;
	ll ans = kek(mask, n);
	cout << ans  / 2<< '\n';
}

/*
6
0 0 1 0
1 0 0 1
0 1 0 0
0 0 -1 -1
-1 -1 -2 -1
-2 -1 0 0
*/

详细

Test #1:

score: 0
Wrong Answer
time: 455ms
memory: 6540kb

input:

12
1754 -1894 1131 163
-1361 350 1392 -1473
1672 -1863 -634 1706
-1869 498 -432 700
355 1737 -1052 -771
590 1273 -158 778
-1599 1914 -1543 -1839
191 995 -1589 -1387
-1126 -30 854 -1504
-1127 -794 -234 523
-653 -1719 903 -1828
-325 -1165 1958 -1015

output:

0

result:

wrong answer 1st lines differ - expected: '154903', found: '0'