DOJ logoDOJ
문제
최근 추가된 문제들저장한 문제
카테고리DLC대회그룹팀게시판
랭킹
문제 풀이 랭킹스트릭 랭킹DOJ Power 랭킹
현황
문제 제안로그인회원가입
DOJ logoDOJ

OI 서브태스크 채점, Elo 레이팅, Discord 인증을 갖춘 커뮤니티 온라인 저지.

문제
문제 목록카테고리
커뮤니티
대회랭킹게시판공지사항외부 대회 개최이용 안내
계정
로그인회원가입채점 현황
정책
이용약관DLC 이용 규칙개인정보 처리방침API 사용 설명서언어별 채점 환경대회 순위 보상레이팅과 퍼포먼스
© 2026 DOJ
모든 권리 보유
해설

강한 레이저

문제로 돌아가기

해설

각 행에 있는 블록의 개수를 독립적으로 구하면 전체 블록의 개수를 알 수 있다. 사실 열 방향 레이저의 정보는 필요하지 않다.

어떤 행에 블록이 xxx개 있다고 하자. 이 행에 강도 kkk인 레이저를 왼쪽에서 오른쪽으로 발사하면 다음이 성립한다.

  • x≤kx \le kx≤k이면 레이저는 모든 블록을 관통하고 격자 밖으로 빠져나간다.
  • x>kx > kx>k이면 레이저는 (k+1)(k+1)(k+1)번째 블록에서 멈춘다.

따라서 실험 결과가 n+1n+1n+1이면 그 행의 블록 개수는 kkk 이하이고, 그렇지 않으면 kkk보다 크다. 즉, 한 번의 실험으로 각 행에 대해 블록 개수와 kkk의 대소관계를 알 수 있다.

0≤x≤n0 \le x \le n0≤x≤n이므로 각 행의 블록 개수는 이분 탐색으로 찾을 수 있다. 중요한 점은 한 번의 실험에서 모든 행에 대해 서로 다른 강도를 동시에 설정할 수 있다는 것이다. 따라서 모든 행의 이분 탐색을 병렬로 진행할 수 있다.

각 행에 대해 현재 가능한 범위를 [Li,Ri][L_i, R_i][Li​,Ri​]로 두고, midi=⌊(Li+Ri)/2⌋mid_i = \lfloor (L_i + R_i) / 2 \rfloormid를 해당 행의 레이저 강도로 설정한다. 열 레이저의 강도는 아무 값이나 넣어도 되므로 으로 둔다.

실험 결과에 따라 다음과 같이 갱신한다.

  • iii번째 행 레이저가 격자 밖으로 빠져나갔다면, 그 행의 블록 개수는 midimid_imidi​ 이하이므로 Ri=midiR_i = mid_iRi​=.

n≤100n \le 100n≤100이므로 각 행의 범위 크기는 최대 101101101이고, 이분 탐색에는 최대 777번의 실험이면 충분하다. 이는 제한인 101010번 이하이다.

모든 행에 대해 Li=RiL_i = R_iLi​=Ri​가 되면, LiL_iLi​가 번째 행의 블록 개수이다. 따라서 정답은

∑i=1nLi\sum_{i=1}^{n} L_ii=1∑n​Li​

이다.

시간 복잡도는 한 번의 실험 결과를 처리하는 데 O(n)O(n)O(n)이고, 실험 횟수는 최대 777번이므로 O(nlog⁡n)O(n \log n)O(nlogn)이다.

i​
=
⌊(Li​+
Ri​)/2⌋
000
mi
di​
  • 그렇지 않다면, 그 행의 블록 개수는 midimid_imidi​보다 크므로 Li=midi+1L_i = mid_i + 1Li​=midi​+1.
  • iii