import static java.lang.Math.*; import static java.util.Arrays.*; import java.util.*; public class Main { Scanner sc = new Scanner(System.in); void run() { int M = sc.nextInt(), N = sc.nextInt(); P[] ps = new P[M], qs = new P[N]; for (int i = 0; i < M; i++) ps[i] = new P(sc.nextInt(), sc.nextInt()); for (int i = 0; i < N; i++) qs[i] = new P(sc.nextInt(), sc.nextInt()); double res = 0, area = 0; for (int i = 0; i < N; i++) { P[] vs = ps; for (int j = 0; j < N; j++) if (i != j) { P p1 = qs[i].add(qs[j]).mul(0.5), p2 = p1.add(qs[j].sub(qs[i]).rot90()); vs = convexCut(vs, p1, p2); } int n = vs.length; for (int j = 0; j < n; j++) { P p1 = vs[j].sub(qs[i]), p2 = vs[(j + 1) % n].sub(qs[i]); res += f(p1, p2); area += p1.det(p2); } } System.out.printf("%.10f%n", res / area / 6); } double f(P s, P t) { return g(s.x, t.x) * (t.y - s.y) - g(s.y, t.y) * (t.x - s.x); } double g(double s, double t) { return (s * s + t * t) * (s + t); } double EPS = 1e-10; int sig(double d) { return (d < -EPS) ? -1 : (d > EPS) ? 1 : 0; } class P { double x, y; P(double x, double y) { this.x = x; this.y = y; } P add(P p) { return new P(x + p.x, y + p.y); } P sub(P p) { return new P(x - p.x, y - p.y); } P mul(double d) { return new P(x * d, y * d); } double det(P p) { return x * p.y - y * p.x; } double abs2() { return x * x + y * y; } P rot90() { return new P(-y, x); } } P[] convexCut(P[] ps, P p1, P p2) { int n = ps.length; ArrayList

res = new ArrayList

(); for (int i = 0; i < n; i++) { int d1 = sig(p2.sub(p1).det(ps[i].sub(p1))); int d2 = sig(p2.sub(p1).det(ps[(i + 1) % n].sub(p1))); if (d1 >= 0) res.add(ps[i]); if (d1 * d2 < 0) res.add(isLL(p1, p2, ps[i], ps[(i + 1) % n])); } return res.toArray(new P[0]); } P isLL(P p1, P p2, P q1, P q2) { double d = q2.sub(q1).det(p2.sub(p1)); if (abs(d) < EPS) return null; return p1.add(p2.sub(p1).mul(q2.sub(q1).det(q1.sub(p1)) / d)); } public static void main(String[] args) { new Main().run(); } }