만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

삼각형 게임

시간 제한2초메모리 제한2048 MB

요약
y=0과 y=2 위의 점들로 서로 겹치지 않는 삼각형 k개를 만들어 넓이 합의 최댓값을 k마다 구하는 문제입니다.
난이도

보통10점 중 7점

유형
정렬, 누적 합, 그리디, 수학
정답자
아직 제출이 없습니다

문제

Little John은 집을 사려면 돈이 필요하다. 그런데 최근에 일자리를 잃었다. 그러면 이제 어떻게 돈을 벌까? 당연히 보상으로 돈을 주는 게임을 하면 된다. 다만 아마 여러분이 떠올린 그런 게임은 아닐 것이다.

평면 위에 서로 다른 n+mn+m개의 점 (a_1,0),(a_2,0),…,(a_n,0),(b_1,2),(b_2,2),…,(b_m,2)(a\_1,0), (a\_2,0), \ldots, (a\_{n},0), (b\_1,2), (b\_2,2), \ldots, (b\_{m},2)가 있다. 처음 점수는 00이다. 점수를 얻으려면 다음 연산을 수행할 수 있다.

  • 일직선 위에 있지 않은 서로 다른 세 점을 고른다.
  • 세 점이 이루는 삼각형의 넓이만큼 점수를 얻는다.
  • 세 점을 평면에서 지운다.

연산을 두 번 수행한 게임의 예시이다.

수행할 수 있는 연산의 최대 횟수를 k_max⁡k\_{\max}라고 하자. 예를 들어 어떤 연산도 할 수 없으면 k_max⁡k\_{\max}는 00이다. f(k)f(k)는 연산을 정확히 kk번 수행해서 얻을 수 있는 최대 점수로 정의한다. f(k)f(k)는 0≤k≤k_max⁡0 \le k \le k\_{\max}인 모든 정수 kk에 대해 정의된다.

k_max⁡k\_{\max}의 값을 구하고, x=1,2,…,k_max⁡x=1,2,\ldots,k\_{\max}인 각 정수 xx에 대해 f(x)f(x)의 값을 구하라.

입력

각 입력에는 여러 개의 테스트 케이스가 들어 있다. 첫 줄에는 테스트 케이스의 개수 tt (1≤t≤3⋅1041 \le t \le 3 \cdot 10^4)가 주어진다. 테스트 케이스가 이어진다.

각 테스트 케이스의 첫 줄에는 정수 nn과 mm (1≤n,m≤2⋅1051 \le n,m \le 2 \cdot 10^5)이 주어진다.

둘째 줄에는 y=0y=0 위의 점인 서로 다른 정수 nn개 a_1,a_2,…,a_na\_1,a\_2,\ldots,a\_{n} (−109≤a_i≤109-10^9 \le a\_i \le 10^9)이 주어진다.

셋째 줄에는 y=2y=2 위의 점인 서로 다른 정수 mm개 b_1,b_2,…,b_mb\_1,b\_2,\ldots,b\_{m} (−109≤b_i≤109-10^9 \le b\_i \le 10^9)이 주어진다.

모든 테스트 케이스에서 nn의 합과 mm의 합은 각각 2⋅1052 \cdot 10^5를 넘지 않는다.

출력

각 테스트 케이스마다 최대 두 줄을 출력한다.

첫 줄에는 k_max⁡k\_{\max}의 값을 출력한다.

둘째 줄에는 k_max⁡k\_{\max}개의 정수 f(1),f(2),…,f(k_max⁡)f(1),f(2),\ldots,f(k\_{\max})를 출력한다. k_max⁡k\_{\max}가 00이면 이 줄은 생략해도 된다.

이 문제의 제약에서 모든 f(x)f(x) 값은 101610^{16} 이하의 정수임이 보장된다.

힌트

첫 번째 테스트 케이스에는 1+3=41+3=4개의 점 (0,0),(0,2),(1,2),(−1,2)(0,0),(0,2),(1,2),(-1,2)가 있다. 연산을 두 번 이상 수행할 수 없음을 보일 수 있다. 따라서 k_max⁡k\_{\max}는 11이고, 구해야 하는 값은 f(1)f(1)뿐이다.

세 꼭짓점으로 (0,0)(0,0), (−1,2)(-1,2), (1,2)(1,2)를 고를 수 있다. 이 삼각형의 넓이는 22이므로 점수가 22 오르고 세 점이 지워진다. 연산을 한 번 했을 때 얻을 수 있는 최대 점수는 22임을 보일 수 있다. 따라서 f(1)=2f(1)=2이다.

다섯 번째 테스트 케이스에는 8+2=108+2=10개의 점이 있다. 연산을 세 번 이상 수행할 수 없음을 보일 수 있다. 따라서 k_max⁡k\_{\max}는 22이고, 구해야 하는 값은 f(1)f(1)과 f(2)f(2)이다.

연산을 한 번 해서 점수를 최대로 만들려면 (198 872 582,0)(198\,872\,582,0), (−1 000 000 000,2)(-1\,000\,000\,000,2), (1 000 000 000,2)(1\,000\,000\,000,2)를 고른다. 점수는 2 000 000 0002\,000\,000\,000이 되므로 f(1)=2 000 000 000f(1)=2\,000\,000\,000이다.

연산을 정확히 두 번 해서 점수를 최대로 만들려면 먼저 (−509 489 796,0)(-509\,489\,796,0), (553 177 666,0)(553\,177\,666,0), (−1 000 000 000,2)(-1\,000\,000\,000,2)를 고른다. 그다음 (−400 714 529,0)(-400\,714\,529,0), (564 040 265,0)(564\,040\,265,0), (1 000 000 000,2)(1\,000\,000\,000,2)를 고른다. 점수는 2 027 422 2562\,027\,422\,256이 되므로 f(2)=2 027 422 256f(2)=2\,027\,422\,256이다.

예제1

  1. 예제 1

    입력
    5
    1 3
    0
    0 1 -1
    2 4
    0 100
    -100 -50 0 50
    2 4
    0 1000
    -100 -50 0 50
    6 6
    20 1 27 100 43 42
    100 84 1 24 22 77
    8 2
    564040265 -509489796 469913620 198872582 -400714529 553177666 131159391 -20796763
    -1000000000 1000000000
    
    예상 출력
    1
    2
    2
    150 200
    2
    1000 200
    4
    99 198 260 283
    2
    2000000000 2027422256