立命館合宿2013 1日目 F Balloon Contest

制約条件

n≦100
m≦10

方針

全員の移動速度は同じなので、
Aの人がボールを取れる⇔Aの人が一番近い領域にボールが落ちる、
ということが言える。


これはAのボロノイ領域。


Aのボロノイ領域にボールが落ちる確率は、
(Aのボロノイ領域とボールが落ちる長方形の交わりの面積) / (ボールの落ちる全体の面積)
であるので、図形の交わりの面積を求めれば確率が簡単にもとまる。


ボロノイ領域は愚直にやり、図形の交わりも愚直に切った。
制約が小さいので余裕で通る。

ソースコード

G voronoi(const G &g, G S, int idx){
	rep(i, g.size()) if(i != idx){
		P d = (g[i] - g[idx]) * P(0, 1);
		P m = (g[i] + g[idx]) * 0.5;
		L l(m, m + d);
		S = convex_cut(S, l);
	}
	return S;
}
G convex_is(G g, const G &e){
	rep(i, e.size()) g = convex_cut(g, L(e[i], e[(i + 1) % e.size()]));
	return g;
}
double area(const G &g){
	double a = 0;
	rep(i, g.size()) a += cross(curr(g, i), next(g, i));
	return abs(a) / 2;
}

int n, m;

int main(){
	while(cin >> n >> m, n){
		G g(n);
		rep(i, n) cin >> g[i].real() >> g[i].imag();
		vector<G> voro;
		
		G S;
		S.pb(P(-inf, -inf));
		S.pb(P(inf, -inf));
		S.pb(P(inf, inf));
		S.pb(P(-inf, inf));
		
		double e[100] = {};
		rep(i, n) voro.pb(voronoi(g, S, i));
		
		rep(i, m){
			G rect;
			P p;
			double dy, dx, s;
			cin >> p.real() >> p.imag() >> dx >> dy >> s;
			
			rect.pb(P(-dx, -dy));
			rect.pb(P(dx, -dy));
			rect.pb(P(dx, dy));
			rect.pb(P(-dx, dy));
			rep(j, 4) rect[j] += p;
			
			rep(j, n){
				G a = convex_is(rect, voro[j]);
				e[j] += s * area(a) / dx / dy / 4;
			}
		}
		printf("%.9f\n", *max_element(e, e + n));
	}
	return 0;
}