AtCoder 🟡 ABC389D Squares in Circle
本文已於 2026-06-25 翻新,原文可見 🔗 AtCoder Beginner Contest 389 解題紀錄 (A - F)
🔗 🟡 ABC389D Squares in Circle
Problem Statement
題目簡述
在二維座標平面上,有一個無限延伸的 正方形棋盤。以原點為圓心畫一個半徑為 的圓,求有多少個正方形能被這個圓完全包含。換句話說,正方形的四個角與原點的距離都必須不超過 。
Constraints
約束條件
思路:幾何 + 雙指標

題型定位
核心考點是在二維平面上統計滿足幾何條件的格子數量。如果直接枚舉圓附近所有可能的中心點,複雜度會到 ;而 最大到 ,這條路走不通。
所以重點不是換一個更快的資料結構,而是先把幾何條件壓縮:利用圓的對稱性減少需要統計的區域,再利用邊界的單調性把二維枚舉降成線性掃描。
從對稱性拆解問題
圓關於 軸與 軸對稱,棋盤本身也有同樣的對稱性。因此只要知道第一象限內有多少個符合條件的正方形,就能用對稱性推出其他象限的數量。
不過座標軸上的正方形不能直接混進象限裡一起乘以 ,否則會重複計算。因此先依照中心位置分成三類:
- 中心在圓心:由於 ,此正方形必在圓內,固定 個。
- 中心在座標軸上:正 軸上有 個,四條半軸共 個。
- 中心在象限內:由對稱性,只需計算第一象限的數量再乘以 。
遇到圓、正方形網格、曼哈頓距離這類天然對稱的幾何計數題,可以先把特殊位置(原點、座標軸)單獨拿出來,再只處理一個象限。這樣既能降低討論量,也能避開重複計數。
第一象限的雙指標
接著只看第一象限。對於中心為 ()的正方形,離原點最遠的角一定是右上角 。只要這個角落在圓內,其餘三個角也一定在圓內。
因此,正方形完全在圓內等價於:
當橫座標往右移時, 會變大。若仍要留在圓內,縱座標的上界只可能下降,不可能上升。也就是說,對每個橫座標而言,合法的最高位置是單調不增的,這正是雙指標能成立的原因。
做法就很自然了:從第一象限中可能的最高位置開始,橫座標從左到右掃過;如果當前位置超出圓,就把高度往下調,直到重新落回圓內。
此時,對於當前橫座標,從 到目前高度的所有位置都合法,因為越往下距離原點越近。所以每一列的貢獻就是目前高度。把第一象限的貢獻加總後乘以 ,再加上原點與座標軸上的部分,就是答案。
當一個維度增加時,另一個維度的合法邊界只會單向移動,就可以考慮用雙指標把 的枚舉壓到 。內層 while 迴圈看起來像是又跑了一層,但指標全程只會往同一個方向移動,因此總移動次數仍是線性的。
複雜度分析
- 時間複雜度:
- 外層枚舉 需要 ,內層 只會減少,總共最多減少 次,均攤 每次迭代。
- 空間複雜度:
Code
1 | R = int(input()) |







![Luogu 🟣 P3195 [HNOI2008] 玩具装箱](https://i.gdst.dev/cover/P3195.webp)
