DOJ logoDOJ
問題
最近追加された問題保存した問題
カテゴリDLCコンテストグループチーム掲示板
ランキング
正解数ランキングストリークランキングDOJ Powerランキング
提出状況
問題募集ログイン新規登録
DOJ logoDOJ

OI形式のサブタスク採点、Eloレーティング、Discord認証を備えたオンラインジャッジです。

問題
問題一覧カテゴリ
コミュニティ
コンテストランキング掲示板お知らせ外部のコンテストを開催するガイド
アカウント
ログイン新規登録ジャッジ状態
ポリシー
利用規約DLCの利用規則プライバシーAPI 文書言語ランタイムコンテストの順位報酬レーティングとパフォーマンス
© 2026 DOJ
All rights reserved
解説

Ishigami Does Not Want to See Couples

問題に戻る

解説

두 성별을 서로 바꾸어도 만나는 횟수는 바뀌지 않는다. 따라서 더 적은 쪽의 학생 수를 s=min⁡(B,G)s=\min(B,G)s=min(B,G)라고 하고, 이 학생들이 차지할 sss개의 칸을 고른 뒤 나머지 칸을 다른 성별로 채우자. B=GB=GB=G이면 어느 쪽을 골라도 된다. s=0s=0s=0이면 격자 전체를 한 성별로 채우면 된다.

s>0s>0s>0일 때 최솟값은 다음 두 값 중 작은 값이다.

C1=⌈2s⌉.C_1=\left\lceil2\sqrt{s}\right\rceil.C1​=⌈2s​

C2C_2C2​는 sss가 NNN의 배수이면 NNN, 그렇지 않으면 N+1N+1N로 정의한다. 각 값에 대응하는 배치를 만들 수 있으므로, 두 값을 비교하여 더 작은 쪽의 배치를 출력하면 된다.

첫 번째 배치는 왼쪽 위에서 정사각형에 가까운 모양을 만든다. p=⌊s⌋p=\lfloor\sqrt{s}\rfloorp=⌊s​⌋, r=s−p2r=s-p^2r=라고 하자. 먼저 왼쪽 위의 정사각형을 채운다. 이어서 정사각형 바로 오른쪽 열의 위쪽부터 칸을 채운다. 이면 정사각형 바로 아래 행의 왼쪽부터 칸을 더 채운다. 이므로 이 과정에서 정확히 칸을 채운다.

이때 C1C_1C1​은 제곱근의 소수 부분을 사용하지 않고 계산할 수 있다. r=0r=0r=0이면 2p2p2p, 1≤r≤p1\leq r\leq p1≤이면 , 이면 이다. 정수 는 를 만족하도록 구한다.

두 번째 배치는 첫 번째 행부터 아래로 내려가며, 각 행에서는 왼쪽부터 오른쪽으로 sss칸을 채운다. 완전히 채운 행들 뒤에 필요하면 일부만 채운 행 하나가 생긴다.

C1<C2C_1<C_2C1​<C2​이면 첫 번째 배치를, 아니면 두 번째 배치를 선택한다. 각 행에서 채워야 하는 칸의 수를 바로 계산할 수 있으므로 한 행씩 만들어 출력하면 된다. 출력해야 하는 칸이 N2N^2N2개이므로 시간 복잡도는 이고, 한 행을 담는 문자열을 사용하면 공간 복잡도는 이다.

증명

선택한 성별의 칸을 sss개 칠했다고 생각하고, 색이 다른 두 칸 사이의 변의 개수를 경계의 길이라고 하자. 이는 만나는 횟수와 같다.

먼저 모든 칠한 칸을 각 행의 왼쪽으로 붙인다. 한 행에 칠한 칸과 칠하지 않은 칸이 모두 있으면 원래 가로 방향의 경계가 적어도 하나인데, 왼쪽으로 붙인 뒤에는 정확히 하나이다. 인접한 두 행의 칠한 칸 수가 각각 x,yx,yx,y라면 두 행 사이의 경계는 원래 적어도 ∣x−y∣|x-y|∣x−y∣개이고, 왼쪽으로 붙인 뒤에는 정확히 ∣x−y∣|x-y|개이다. 따라서 이 변형은 경계의 길이를 늘리지 않는다.

Solution written by GPT6

⌉
.
+
1
s
−
p2
p×pp\times pp×p
min⁡(r,p)\min(r,p)min(r,p)
r>pr>pr>p
r−pr-pr−p
0≤r≤2p0\leq r\leq2p0≤r≤2p
sss
r≤
p
2p+12p+12p+1
p<r≤2pp<r\leq2pp<r≤2p
2p+22p+22p+2
ppp
p2≤s<(p+1)2p^2\leq s<(p+1)^2p2≤s<(p+1)2
O(N2)O(N^2)O(N2)
O(N)O(N)O(N)
∣
x
−
y∣

다음으로 칠한 칸 수가 많은 행부터 정렬한다. 가로 방향의 경계 수는 그대로이다. 세로 방향의 경계 수는 인접한 행의 칠한 칸 수 차이의 절댓값의 합인데, 어떤 순서에서도 최댓값과 최솟값의 차이 이상이다. 내림차순으로 정렬하면 정확히 그 차이가 되므로 경계의 길이는 늘어나지 않는다.

정렬한 행들의 칠한 칸 수를 ℓ1≥ℓ2≥⋯≥ℓN\ell_1\geq\ell_2\geq\cdots\geq\ell_Nℓ1​≥ℓ2​≥⋯≥ℓN​이라 하고, 0<ℓi<N0<\ell_i<N0<ℓi​<N인 행의 수를 qqq라고 하자. 이 배치의 경계 길이는

E=q+ℓ1−ℓNE=q+\ell_1-\ell_NE=q+ℓ1​−ℓN​

이다. 다음 네 경우를 나누어 하한을 구한다.

  • ℓN=0\ell_N=0ℓN​=0, ℓ1<N\ell_1<Nℓ1​<N인 경우, 칠한 칸이 있는 행은 모두 일부만 칠한 행이다. 따라서 s≤qℓ1s\leq q\ell_1s≤qℓ1​이고, E=q+ℓ1≥2sE=q+\ell_1\geq2\sqrt{s}E=q+ℓ1​≥2s이므로 E≥C1E\geq C_1E≥C1​이다.
  • ℓN>0\ell_N>0ℓN​>0, ℓ1=N\ell_1=Nℓ1​=N인 경우, 칠한 칸과 칠하지 않은 칸을 바꾸고 격자를 180도 회전하면 바로 앞의 경우가 된다. 이때 칠한 칸 수는 이므로 역시 이다.
  • ℓN=0\ell_N=0ℓN​=0, ℓ1=N\ell_1=Nℓ1​=N인 경우, E=N이다. 이면 는 의 배수이다. 따라서 가 의 배수이면 , 그렇지 않으면 이므로 이다.
  • ℓN>0\ell_N>0ℓN​>0, ℓ1<N\ell_1<Nℓ1​<N인 경우, 모든 행이 일부만 칠해져 q=이다. 이면 모든 행의 칠한 칸 수가 같아 는 의 배수이다. 따라서 앞의 경우와 마찬가지로 이다.

어떤 배치도 경계를 늘리지 않고 위 형태로 바꿀 수 있으므로, 원래 배치의 경계 길이 역시 min⁡(C1,C2)\min(C_1,C_2)min(C1​,C2​) 이상이다.

첫 번째 구성은 칠한 부분의 높이와 너비의 합이 C1C_1C1​이며, 각 행의 칠한 칸 수가 내림차순이다. 따라서 경계 길이는 C1C_1C1​ 이하이다. 격자의 끝에 닿아 경계가 사라지는 경우에도 이 상한은 성립한다.

두 번째 구성에서 s≥Ns\geq Ns≥N이면 경계 길이는 C2C_2C2​이다. 0<s<N0<s<N0<s<N이면 첫 행의 일부만 칠하므로 경계 길이는 s+1≤N+1=C2s+1\leq N+1=C_2s+1≤N+1=C2​이다. 따라서 두 번째 구성의 경계 길이는 항상 C2C_2C2​ 이하이다.

두 구성 중 작은 상한에 대응하는 배치의 경계 길이는 min⁡(C1,C2)\min(C_1,C_2)min(C1​,C2​) 이하이고, 앞에서 모든 배치에 대해 같은 값 이상의 하한을 증명했다. 그러므로 선택한 배치는 최적이다.

​
180
180
N2−s≥sN^2-s\geq sN2−s≥s
E≥⌈2N2−s⌉≥C1E\geq\lceil2\sqrt{N^2-s}\rceil\geq C_1E≥⌈2N2−s​⌉≥C1​
+qE=N+q
E=N+q
q=0q=0q=0
sss
NNN
sss
NNN
E≥NE\geq NE≥N
E≥N+1E\geq N+1E≥N+1
E≥C2E\geq C_2E≥C2​
Nq=N
q=N
ℓ1=ℓN\ell_1=\ell_Nℓ1​=ℓN​
sss
NNN
E=N+ℓ1−ℓN≥C2E=N+\ell_1-\ell_N\geq C_2E=N+ℓ1​−ℓN​≥C2​