DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类DLC比赛小组团队讨论区
排名
解题数量排行榜连续解题排名DOJ Power 排行榜
评测状态
征题登录注册
DOJ logoDOJ

支持 OI 子任务计分、Elo 等级分和 Discord 认证的社区在线评测系统。

题目
题目列表分类
社区
比赛排名讨论区公告举办外部比赛指南
账号
登录注册评测状态
政策
服务条款DLC 使用规则隐私政策API 文档语言运行环境比赛排名奖励评级与表现
© 2026 DOJ
保留所有权利
题解

Strong Laser

返回题目

题解

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

어떤 행에 블록이 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