There are two small spaceship, surrounded by two groups of enemy larger spaceships. The space is a two-dimensional plane, and one group of the enemy spaceships is positioned in such a way that they all have integer $y$-coordinates, and their $x$-coordinate is equal to $-100$, while the second group is positioned in such a way that they all have integer $y$-coordinates, and their $x$-coordinate is equal to $100$.

Each spaceship in both groups will simultaneously shoot two laser shots (infinite ray that destroys any spaceship it touches), one towards each of the small spaceships, all at the same time. The small spaceships will be able to avoid all the laser shots, and now want to position themselves at some locations with $x=0$ (with not necessarily integer $y$-coordinates), such that the rays shot at them would destroy as many of the enemy spaceships as possible. Find the largest numbers of spaceships that can be destroyed this way, assuming that the enemy spaceships can't avoid laser shots.


-----Input-----

The first line contains two integers $n$ and $m$ ($1 \le n, m \le 60$), the number of enemy spaceships with $x = -100$ and the number of enemy spaceships with $x = 100$, respectively.

The second line contains $n$ integers $y_{1,1}, y_{1,2}, \ldots, y_{1,n}$ ($|y_{1,i}| \le 10\,000$) — the $y$-coordinates of the spaceships in the first group.

The third line contains $m$ integers $y_{2,1}, y_{2,2}, \ldots, y_{2,m}$ ($|y_{2,i}| \le 10\,000$) — the $y$-coordinates of the spaceships in the second group.

The $y$ coordinates are not guaranteed to be unique, even within a group.


-----Output-----

Print a single integer – the largest number of enemy spaceships that can be destroyed.


-----Examples-----
Input
3 9
1 2 3
1 2 3 7 8 9 11 12 13

Output
9

Input
5 5
1 2 3 4 5
1 2 3 4 5

Output
10



-----Note-----

In the first example the first spaceship can be positioned at $(0, 2)$, and the second – at $(0, 7)$. This way all the enemy spaceships in the first group and $6$ out of $9$ spaceships in the second group will be destroyed.

In the second example the first spaceship can be positioned at $(0, 3)$, and the second can be positioned anywhere, it will be sufficient to destroy all the enemy spaceships.

Source: codeforces | Difficulty: HARD
Tags: Geometry

Bit manipulation

Complete search


Solutions:
from collections import Counter
MV = 400020
a = [0] * MV
for i in range(MV):
	a[i] = set()
(n, m) = list(map(int, input().split()))
first = list(map(int, input().split()))
second = list(map(int, input().split()))
for (fid, f) in enumerate(first):
	for (sid, s) in enumerate(second):
		a[f + s].add(fid + MV)
		a[f + s].add(sid)
a.sort(key=lambda x: -len(x))
b = [len(k) for k in a]
best_res = b[0]
for pos in range(MV):
	for pos2 in range(MV):
		if b[pos] + b[pos2] <= best_res:
			break
		cur = len(a[pos].union(a[pos2]))
		if cur > best_res:
			best_res = cur
print(best_res)


(n, m) = map(int, input().strip().split())
y1 = list(map(int, input().strip().split()))
y2 = list(map(int, input().strip().split()))
y1.sort()
y2.sort()
u1 = list()
u2 = list()
p = 0
while p < n:
	q = p
	while q < n and y1[q] == y1[p]:
		q += 1
	u1.append((y1[p], q - p))
	p = q
p = 0
while p < m:
	q = p
	while q < m and y2[q] == y2[p]:
		q += 1
	u2.append((y2[p], q - p))
	p = q
n = len(u1)
m = len(u2)
res = 0
for i in range(n):
	for j in range(m):
		ya = u1[i][0] + u2[j][0]
		y1_stat = [True] * n
		y2_stat = [True] * m
		for ii in range(n):
			for jj in range(m):
				if u1[ii][0] + u2[jj][0] == ya:
					y1_stat[ii] = False
					y2_stat[jj] = False
		f = dict()
		for ii in range(n):
			for jj in range(m):
				yb = u1[ii][0] + u2[jj][0]
				inc = 0
				if y1_stat[ii]:
					inc += u1[ii][1]
				if y2_stat[jj]:
					inc += u2[jj][1]
				if yb in f:
					f[yb] += inc
				else:
					f[yb] = inc
		yb = -1
		if f:
			yb = max(f, key=f.get)
			for ii in range(n):
				for jj in range(m):
					if u1[ii][0] + u2[jj][0] == yb:
						y1_stat[ii] = False
						y2_stat[jj] = False
		cur = 0
		cur += sum((u1[ii][1] for ii in range(n) if not y1_stat[ii]))
		cur += sum((u2[jj][1] for jj in range(m) if not y2_stat[jj]))
		res = max(res, cur)
print(res)