如果你想在比賽結束後解題,請在 DOMjudge 界面的右上角 contest 選擇 "PCCAWinter2020p"(NCTU PCCA Winter Camp Contest 2020 - Practice) 再上傳,否則只會收到各種 TOO-LATE
A | B | C | D |
E | F | G | H |
給平面上一條折線,對於每個頂點 ,請求出 座標最高的頂點 使得線段 除了端點外都嚴格在折線上方(即 看得到 )。(好像沒翻譯到)
這題是生另一道毒瘤難題時順便產出來的東西,但比賽縮短成 3 小時後難題就被砍掉了QQ
賽中覺得應該放那題而不是這東西
Lemma: 對於每個點 ,它往左能看到最高的點 一定在它左邊的凸包上。
證明:假設 關於左邊凸包的切點是 ,那 看得到的頂點們一定在 和 之間。假設這其中最高的點是 (注意到 一定在該凸包上),可以分成兩種 case:
因此有 。對於每個點 ,他的答案是往左能看到最高的點 、往右能看到最高的點 以 三者 座標的最大值。根據 lemma,我們只要從左右各建一次凸包就可以維護每個點的答案。
給定 每個點的高度,多次詢問某個 區間高度不大於 的點有幾個
本題有多種解法,以下為其一。
先假設位置 的高度為 ,對於每個詢問,可以將其拆成 ( 有幾個點不大於 ) - ( 有幾個點不大於 )。我們可以離線處理,先存下每筆詢問所有需要查詢的資訊,由左向右建對於高度出現次數的 BIT,湊出每筆詢問的答案。
給定計算美麗值的規則,再每拔掉一顆聖誕樹時輸出當下最高的美麗值。
本題有多種解法,以下為其一。
維護一個 為已經被移除的點,初始丟入
維護一個 為每個連通塊的最大美麗值 初始丟入
接著對於美麗值做一個 結構, 查詢區間最大值。
每做一次移除 操作會先在 中查找出目前連通塊的左右界 ,接著找出這個範圍內的美麗值 ,在 中將 移除。
若 不為 則右邊會切出一塊新的,在 中加入 。
若 不為 則左邊會切出一塊新的,在 中加入 。
在 中加入 ,輸出中的最大值,即完成一次操作。
每次操作複雜度為 總複雜度為
給定定義好的山的形狀,問限定寬度及高度下,有幾種合法的山。
定義 dp[目前位置] [結尾高度] = 非遞減序列數量
此表可由下列式子建出
接著枚舉中間點位置及高度,設位置為 高度為 ,則組合數為後方合法方法數 * 前方合法方法數
固定位置,由小至大枚舉的高度即可在計算和時重複利用先前的和。
注意好 的處理
總複雜度為
在定義好的 上找循環。
是將 內的數字重新排序,由大到小減去由小到大。
因為黑洞數的性質 會收斂得非常快,直接跑 的值並記下時間戳記(假設青蛙一秒跳一次),當遇到重複的話就拿當前的時間減去記下的時間輸出就好。
給一個 無向Grid, 有點權跟邊權, 問 s 是 (1,1),t 是 (n,n) 的 minimum st-cut
每個點拆成in-node跟out-node, 兩個node之間放點權, 其餘邊權接好(out-node -> in-node), 取最大流就是最小割。
(對應到第一張圖的例子)
(worst case不好構, 高估很多, 實測約比標程式慢2.5倍)
綠色邊邊權為0, 紅色邊邊權為切到原圖對應邊的邊權, 彩色點權對應到原圖的點權, 灰色點權為0。作s->t的帶邊權帶點權的Dijkstra即為所求。(灰色邊並不在所建的圖之中)
(對應到第一張圖的例子)
池塘中間有N個石頭編號1到N, 第N個石頭後面就是陸地, 每顆石頭一開始都各站一隻青蛙, 每個石頭上都有一個數值, 代表站在該石頭上的青蛙想要跳躍時會向右跳的距離, 詢問跳步之後有多少隻青蛙到達岸上。
可以將這個數列建成一棵樹, 每個石頭和陸地都是一個節點, 若第個石頭的值是, 則從節點建一條有向邊到節點, 若則從陸地接出去。
從陸地的節點開始做bfs, 做到深度為K時停下來, 計算走過多少點即為答案。
建圖花費, 每個石頭會連出去一條邊。
bfs花費, 因此總時間複雜度為O(N)。
數列中詢問有沒有偶數個(不包括0)偶數值的數, 並按照題目要求輸出對應的答案。
分case討論,