// Arup Guha
// 11/6/2016
// Solution to 2016 SER D1 Problem F: InTents

import java.util.*;

public class intents {

	public static void main(String[] args) {

		Scanner stdin = new Scanner(System.in);
		int n = stdin.nextInt();

		// Set up points without heights and sort radially.
		pt[] all = new pt[n-1];
		for (int i=0; i<n-1; i++) {
			int x = stdin.nextInt();
			int y = stdin.nextInt();
			all[i] = new pt(x,y);
		}
		Arrays.sort(all);

		// Sort heights also.
		int[] heights = new int[n];
		for (int i=0; i<n; i++)
			heights[i] = stdin.nextInt();
		Arrays.sort(heights);

		// Set up middle pole to be tallest.
		pt mid = new pt(0, 0);
		mid.loc[2] = heights[n-1];

		// Will keep track of which poles we've put in.
		boolean[] used = new boolean[n-1];

		// Find next best pole each time.
		for (int i=n-2; i>=0; i--) {

			int best = -1;
			int bestArea = 0;
			for (int j=0; j<n-1; j++) {

				// Already set this one.
				if (used[j]) continue;

				// Get previous and next points.
				int prev = (j-1+n-1)%(n-1);
				int next = (j+1)%(n-1);

				// Add both triangles.
				int curArea = Math.abs(all[prev].loc[0]*all[j].loc[1]-all[j].loc[0]*all[prev].loc[1]);
				curArea += Math.abs(all[j].loc[0]*all[next].loc[1]-all[next].loc[0]*all[j].loc[1]);

				// Update if this point is more important.
				if (best == -1 || curArea > bestArea) {
					best = j;
					bestArea = curArea;
				}
			}

			// Set this one to be the next highest pole.
			all[best].loc[2] = heights[i];
			used[best] = true;
		}

		// Add up all triangular pieces and output result.
		double res = 0;
		for (int i=0; i<n-1; i++)
			res += volume(mid.loc, all[i].loc, all[(i+1)%(n-1)].loc);
		System.out.printf("%.2f\n", res);
	}

	// Returns the volume of the shape defined by these three 3d pts.
	public static double volume(int[] pt1, int[] pt2, int[] pt3) {

		// Need to know the three z values in order.
		int minZ = Math.min(Math.min(pt1[2], pt2[2]), pt3[2]);
		int maxZ = Math.max(Math.max(pt1[2], pt2[2]), pt3[2]);
		int midZ = pt1[2] + pt2[2] + pt3[2] - minZ - maxZ;

		// Area of bottom triangle.
		double areaBot = Math.abs(.5*((pt2[0]-pt1[0])*(pt3[1]-pt1[1]) - (pt3[0]-pt1[0])*(pt2[1]-pt1[1])));

		// Add in all three parts as multipliers of bottom triangle.
		double vol = areaBot*(minZ+2.0/3*(midZ-minZ)+1.0/3*(maxZ-midZ));
		return vol;
	}
}

class pt implements Comparable<pt> {

	public int[] loc;

	public pt(int x, int y) {
		loc = new int[3];
		loc[0] = x;
		loc[1] = y;
		loc[2] = 0;
	}

	public double angle() {
		return Math.atan2(loc[1], loc[0]);
	}

	// Allows for radial sort.
	public int compareTo(pt other) {
		if (this.angle() < other.angle()-1e-9) return -1;
		if (this.angle() > other.angle()+1e-9) return 1;
		return 0;
	}
}