AtCoder Beginner Contest 389 解題紀錄 (A - F)
🔗 A - 9x9 (abc389 A)
題意
給定一個長度為 的字串 ,輸出 。
思路
將字串轉為整數後相乘即可。
1 | x, y = map(int, input().split("x")) |
🔗 B - tcaF (abc389 B)
tags: 模擬(Simulation)
二分搜尋(Binary Search)
題意
給定一個不小於 的整數 ,找出正整數 使得 。
約束條件
思路:模擬(Simulation) / 二分搜尋(Binary Search)
由於只有一個詢問,因此可以從 開始枚舉 ,直到 為止。
如果有多個詢問的話,可以考慮預處理後使用二分搜尋。
1 | X = int(input()) |
🔗 C - Snake Queue (abc389 C)
tags: 佇列(Queue)
模擬(Simulation)
題意
原本的題目敘述是以下問題的數學化:
有一群蛇在排隊,而每條蛇會佔據一個座標區間 ,其中 為蛇的頭部座標, 為蛇的長度,且隊伍中第一條蛇的頭部座標為 。
現在有 個操作,而每個操作有以下三種:
- 操作 :
1 l
。將一條長度為 的蛇加入到隊伍的末尾,注意其必須緊跟在最後一條蛇的尾巴後面。 - 操作 :
2
。隊伍最前面的蛇離開隊伍,則後續的蛇往前移動,直到隊伍中第一條蛇的頭部座標為 為止。 - 操作 :
3 k
。輸出隊伍中從前面數第 條蛇的頭部座標。
gantt dateFormat x axisFormat %Q Snake1 : 0, 2 Snake2 : 2, 3 Snake3 : 3, 6 Snake4 : 6, 10
約束條件
- 對於操作 ,
- 對於操作 ,保證佇列不為空。
- 對於操作 ,令 為佇列中的蛇的數量,則 。
思路:模擬(Simulation)
由於題目已經給出清晰的操作定義,且題目名稱也已經暗示了這是一道佇列問題,我們可以使用佇列(Queue)來處理這些操作,維護隊伍中的蛇的頭部座標即可。
然而,特別需要注意的是,當執行第二種操作(移除最前面的蛇)時,後續的蛇會因為需要向左平移而改變其座標。但顯然不能真正的將所有蛇的頭部座標減少。
為此可以維護一個變數 ,代表所有蛇的總平移量,每當執行移除操作時,將最前面的蛇的長度加到這個變數 中。對於查詢操作,我們僅需借助這個變數 去計算實際的頭部座標即可。如此我們便可以保存未平移的頭部座標,只要在輸出時減去 即可。
例如以下狀況,此時 ,因此第 條蛇的頭部座標為 。
gantt dateFormat x axisFormat %Q Snake3 : 3, 6 Snake4 : 6, 10
複雜度分析
- 時間複雜度:
- 空間複雜度:
1 | from collections import deque |
🔗 D - Squares in Circle (abc389 D)
tags: 幾何(Geometry)
雙指標(Two Pointers)
題意
在二維座標平面上,存在一個無限延伸的 正方形棋盤。
考慮在這些正方形的中心畫一個半徑為 的圓。這些正方形中有多少個完全包含在圓內?
更準確地說,找出符合條件的整數對 的數量,使得所有四個點 、、 和 與原點的距離均不超過 。
約束條件
思路:幾何(Geometry) + 雙指標(Two Pointers)
根據上圖,可以將問題分為以下 3 種情況:
- 正方形中心在圓心,由於 ,因此固定是 個
- 正方形中心在 軸或 軸上
- 在正 軸上有 個,因此總共有 個
- 正方形中心在象限內
- 由於在二維平面上,圓與坐標軸具有 對稱性。也就是說,若一個正方形位於第一象限內符合條件,則其在其他三個象限的對應位置的正方形也同樣符合條件。因此,我們只需計算第一象限內的符合條件的正方形數量,並將結果乘以 ,即可得到所有象限內的總數。
- 在第一象限中,判斷中心點座標為 的正方形是否在圓內,等同於檢查 到圓心的距離是否
- 由於在第一象限中,當 增加時, 只可能不變或減少,因此可以使用雙指標,從 開始,枚舉 並維護最大的
複雜度分析
- 時間複雜度:
- 枚舉 需要 ,而雖然內層迴圈看似也需要 ,但由於 只會減少,因此 和 實際上都只會最多減少 次。
- 空間複雜度:
1 | R = int(input()) |
🔗 E - Square Price (abc389 E)
tags: 二分搜尋(Binary Search)
題意
有 種產品,每種產品的庫存量均為 單位。
你可以購買每種產品的任意非負數量的單位。若要購買 單位的第 種產品,則需要花費 日元。
如果你的總購買成本最多為 日元,那麼你最多可以購買多少單位的產品總數?
約束條件
思路
由於購買 件商品的總花費為 ,故可以計算出購買第 件商品的價格為 ,故我們可以知道所有 件商品的價格。但顯然不可能列舉出所有商品的價格,而維護一個大小為 的 Heap 也是不可行的,推導如下:
- 若所有商品的價格均為 ,且每種商品均購買 件,則總價格為 ,得
- 而我們需要對 Heap 操作 次,因此需要 的時間複雜度,顯然不可行。
因此考慮 二分搜尋(Binary Search) ,找到一個整數 ,使得我們可以 購買所有價格不超過 x 的商品。對於價格為 的商品,若購買 件,則需滿足 ,此時總價格為 。
二分找到最大的 後,由於此時可能還可以購買部分價格為 的商品,因此先用 計算總價格,若總價格超過 ,則代表超過部分的商品價格都是 ,此時將超過的商品數量減去,即可得到答案。
複雜度分析
- 時間複雜度:
- 二分搜尋可以購買的商品最大價格 需要 的時間
- 檢查函數需要遍歷所有商品,因此需要 的時間
- 空間複雜度:
1 | from math import * |
🔗 F - Rated Range (abc389 F)
tags: 線段樹(Segment Tree)
懶標記線段樹(Lazy Segment Tree)
二分搜尋(Binary Search)
動態規劃(Dynamic Programming)
題意
有 場比賽,在第 場比賽中(),如果參賽選手的 rating 在 和 之間(包含邊界),則他的 rating 增加 ,每個選手都會參加所有比賽。
給定 個查詢,每個查詢提供一個整數 ,表示某選手的初始 rating,請計算選手參加完所有比賽後的最終 rating。
約束條件
思路:線段樹(Segment Tree) + 二分搜尋(Binary Search)
首先考慮最暴力的情況,對於每一個詢問,我們都模擬一遍該選手參加所有比賽的過程,這樣的時間複雜度是 的,這種複雜度是不可接受的。
但可以注意到,每次更新 rating 時,我們只會對一個區間進行操作,而這樣的操作是可以進行合併的。我們可以令 表示當初始分數為 時,參加完第 場比賽後的分數,則有:
邊界條件為 ,所求為 ,其中 。
因此可以考慮維護 ,由於我們不需要中間的結果,因此只要維護 即可。那麼當參加完第 場比賽後,我們可以更新所有滿足 的 ,使用 稀疏表(Sparse Table) 或 線段樹(Segment Tree) 的話,區間更新可以在 的時間內完成,其中 為 rating 的值域,注意區間更新需要使用 懶標記線段樹(Lazy Segment Tree)。
但這樣還有一個問題,如何找到 中的 和 的位置呢?這裡可以利用 的特性,注意到當 時, 的值是單調遞增的,而當 時, 的值也一定是單調不減的,簡略的證明如下:
- 注意到每次比賽只會將符合條件的 rating 增加 ,而初始時 是單調不減的。每次比賽後,滿足條件的 增加 ,這最多只會讓 增加到和 相同,因此 是單調不減的。
根據這個性質,任何時刻的 都是單調不減的,因此可以使用 二分搜尋(Binary Search) 來找到最小的 使得 ,以及最大的 使得 。這樣可以確定需要更新的連續區間,從而利用線段樹進行區間更新。
為方便起見,這裡直接使用 AtCoder Library 的 懶標記線段樹(Lazy Segment Tree)。
複雜度分析
- 時間複雜度:
- 初始化線段樹需要
- 對於每場比賽,需要 的時間找到 和 的位置
- 對於每個查詢,需要 的時間找到 的值
- 空間複雜度:
- 線段樹需要 的空間
1 | from atcoder.lazysegtree import LazySegTree |
寫在最後
PROMPT
masterpiece, best quality, high quality, extremely detailed CG unity 8k wallpaper, extremely detailed, High Detail, vibrant colors, backlight, photo background, anime style,
1girl, solo, Furina, Furina (Genshin Impact), Genshin Impact, long hair, blush, smile, bangs, skirt, shirt, holding, hair between eyes, blue hair, collarbone, jacket, ahoge, outdoors, food, belt, holding food, strawberry, crepe,
An animated image of an anime girl with long blue hair and a white horn on her head. She is holding a cup with strawberries in it. Her eyes are open and her mouth is slightly open. She has a brown purse strap over her left shoulder. Her hair is a light blue color and she is wearing a cream colored shirt with a white collar. Her left hand is raised in the air. Her right hand is holding the ice cream cup. The ice cream is filled with strawberries.
近期打最差的一次,還是要多補題QQ