You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.2 KiB
C++

#define _CRT_SECURE_NO_WARNINGS
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
int sgn(double x)
{
if (x > eps) return 1;
if (x < -eps) return -1;
return 0;
}
struct Point
{
double x, y;
Point operator-(const Point &b) const { return Point{x - b.x, y - b.y}; }
double operator^(const Point &b) const { return x * b.y - y * b.x; }
double operator*(const Point &b) const { return x * b.x + y * b.y; }
};
struct Line
{
Point s, e;
int segcrossseg(Line v)
{
int d1 = sgn((e - s) ^ (v.s - s));
int d2 = sgn((e - s) ^ (v.e - s));
int d3 = sgn((v.e - v.s) ^ (s - v.s));
int d4 = sgn((v.e - v.s) ^ (e - v.s));
if ((d1 ^ d2) == -2 && (d3 ^ d4) == -2) return 2;
return (d1 == 0 && sgn((v.s - s) * (v.s - e)) <= 0) ||
(d2 == 0 && sgn((v.e - s) * (v.e - e)) <= 0) ||
(d3 == 0 && sgn((s - v.s) * (s - v.e)) <= 0) ||
(d4 == 0 && sgn((e - v.s) * (e - v.e)) <= 0);
}
};
const int N = 1050;
int fa[N], sz[N], lcnt;
Line ls[N];
void init()
{
lcnt = 0;
for (int i = 0; i < N; i++) fa[i] = i, sz[i] = 1;
}
int find(int x)
{
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
void link(int x, int y)
{
int fx = find(x), fy = find(y);
if (fx ^ fy)
{
sz[fx] += sz[fy];
fa[fy] = fx;
}
}
int main()
{
int T, n;
scanf("%d", &T);
while (T--)
{
init();
char op[3];
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%s", op);
if (*op == 'P')
{
scanf("%lf%lf%lf%lf", &ls[lcnt].s.x, &ls[lcnt].s.y, &ls[lcnt].e.x, &ls[lcnt].e.y);
for (int l = 0; l < lcnt; l++)
if (ls[lcnt].segcrossseg(ls[l]))
link(l, lcnt);
lcnt++;
}
if (*op == 'Q')
{
int k;
scanf("%d", &k);
printf("%d\n", sz[find(k - 1)]);
}
}
if (T) putchar('\n');
}
return 0;
}