QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#455266 | #1945. Finding Polly | prostoegor239# | WA | 455ms | 6540kb | C++14 | 4.0kb | 2024-06-26 04:29:46 | 2024-06-26 04:29:47 |
Judging History
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
*/
Details
Tip: Click on the bar to expand more detailed information
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'