2022 網際網路程式設計全國大賽 高中組決賽
• 本次比賽共8題,含本封面共26頁。
• 全部題目的輸入都來自標準輸入。輸入中可能包含多組輸入,以題目敘述為主。
• 全部題目的輸出皆輸出到螢幕(標準輸出)。
輸出和裁判的答案必須完全一致,英文字母大小寫不同或有多餘字元皆視為答題錯誤。
• 比賽中上傳之程式碼,使用C 語言請用.c為副檔名;使用C++ 語言則用.cpp 為副檔 名。
• 使用 cin輸入速度遠慢於 scanf輸入,若使用需自行承擔 Time Limit Exceeded的風 險。
• 任何題目內提到的「一行」,皆代表以換行字元「\n」結尾的字串。
• 部分題目有浮點數輸出,會採容許部分誤差的方式進行評測。一般來說「相對或絕對誤差 不超過ϵ皆視為正確」,ϵ值以題目敘述為主。
舉例來說,假設 ϵ= 10−6 且a 是正確答案,b是你的答案,如果符合 max(|a|,|b|,1)|a−b| ≤ 10−6, 就會被評測程式視為正確。
Problem Problem Name Time Limit Memory Limit
A 雅量 1 s 1024 MB
B 選巫醫巫醫 1 s 1024 MB C 巴乙己分組問題 2 s 1024 MB D 教授分球球 1 s 1024 MB E 真島與莉可麗絲 1 s 1024 MB
F 城市規劃 1 s 1024 MB
G 魔族與訓練 3 s 1024 MB
H 買餅乾 1 s 1024 MB
2022 網際網路程式設計全國大賽 輸入輸出範例
C程式範例:
1 #include <stdio.h>
2 int main()
3 {
4 int cases;
5 scanf("%d", &cases);
6 for (int i = 0; i < cases; ++i)
7 {
8 long long a, b;
9 scanf("%lld %lld", &a, &b);
10 printf("%lld\n", a + b);
11 }
12 return 0;
13 }
C++程式範例:
1 #include <iostream>
2 int main()
3 {
4 int cases;
5 std::cin >> cases;
6 for (int i = 0; i < cases; ++i)
7 {
8 long long a, b;
9 std::cin >> a >> b;
10 std::cout << a + b << std::endl;
11 }
12 return 0;
13 }
A. 雅量
Problem ID: generosity
朋友出了一場模擬比賽,沒用的範例帶冗長的敘述。當她拿給我們看時,一位對手速十分 感興趣的同學說:
「啊,好像Codeforces似的。」
「我看倒有點像唬爛大賽。」我說。
「真像一題題IMO。」一位外號叫「方格王」的同學緊接著說。
我們不禁哄堂大笑,同樣的一場比賽,每個人卻有不同的感覺。那位朋友連忙把題本用紙 袋裝好,她覺得模擬比賽就是模擬比賽,不是Codeforces,也不是唬爛大賽,更不是IMO。
現在,給你兩個正整數N, M ,請求出 ∑
1≤i≤N
(⌊log2i⌋ · N!i )
除以M 的餘數。
Input
輸入第一行包含一個正整數T。接下來有T 行,每行有兩個以空白隔開的正整數N, M。
• 1≤N ≤1018
• 1≤M ≤106
• 1≤T ≤30000
• ∑
N ≤1018
• ∑
M ≤106
• 所有的輸入都是正整數。
Output
對於每一組 N, M ,請輸出一行包含一個整數,代表 ∑
1≤i≤N
(⌊log2i⌋ · N!i )
除以M 的餘數。
Sample Input 1 Sample Output 1 3
3 2 5 4
9982 10007
1 0 4798
B. 選巫醫巫醫
Problem ID: absolute
你知道嘛,巫醫巫醫為了選繼承人,每四年就會舉辦一次巫醫巫醫爭奪戰,要讓最強衛冕 者拿到傳奇巫醫巫醫的頭銜。
總共有 N 名參賽者,編號從1到N ,其中編號為i的參賽者的巫力為ai,他們即將在象 大山的女神競技場打架。
比賽的方法如下:
每次由巫醫巫醫指定兩個尚未被打敗的參賽者去打架,並淘汰掉打輸的參賽者。
當兩名參賽者打架,擁有比較多巫力的參賽者獲勝(如果兩個參賽者巫力一樣,編號比較 小的參賽者獲勝)。令x, y 分別是勝者及敗者的編號,在打架完畢後x 的巫力會被y 給消耗。
更精確的來說ax 會變成ax−ay。
經過 N −1場打架之後,沒有輸過的參賽者會成為新一代巫醫巫醫,但是因為經過很多 消耗,這位參賽者的巫力可能大不如前,現在巫醫巫醫希望新一代巫醫巫醫能夠擁有最大的巫 力,請你告訴巫醫巫醫怎麼樣安排比賽最好。
Input
輸入的第一行有一個正整數N。
接下來一行有N 個正整數ai 以一個空白隔開,代表參賽者們的巫力。
• 1< N ≤100
• 1≤ai ≤105
Output
第一行請輸出一個整數代表新一代巫醫巫醫的最後所剩下的巫力。接下來 N −1行,在第 i行請輸出兩個整數以空白隔開,代表參加第i場架的兩位參賽者在打該場架前所剩下的巫力。
如果有多組解,任意一組都會被視為正確。
Sample Input 1 Sample Output 1
4
10 14 20 33
29 14 20 6 10 4 33
C. 巴乙己分組問題
Problem ID: grouping
巴乙己一到店,所有選手便對著他膜拜,有的叫道,「巴乙己,您 CF又增上分數了!」他 不回答,對櫃裏說,「備兩場OI,要一單 Div. 1。」便排出九文大錢。他們又故意的高聲嚷 道,「您一定又電爛人家的自尊了!」巴乙己睜大眼睛說,「你怎麼這樣憑空汚人清白⋯⋯」「什 麼清白?我前天親眼見您海放tourist的題數,吊着打。」巴乙己便漲紅了臉,額上的青筋條條 綻出,爭辯道,「做題不能算電⋯⋯做題!⋯⋯競程人的事,能算電麼?」接連便是難懂的話:
「假設現在二維平面上給定N 個點,你們難道總是能把這些點分成非空的兩組,使得不存 在一個實數點同時落在兩組點的兩個凸包內,還沒有任何給定的點嚴格落在任何一個凸包內部 不成!?」
眾人一聽,愣了,百思不得其解。動輒上萬人給出了下列圖片做為示意圖,滿足左邊第一 張圖是一個合法的分組方式,右邊的兩張圖則都不是合法的分組方式:
作為巴乙己粉絲的你,能給出這道問題的答案嗎?不過為了簡化問題,你只需要先解決
「保證任三點不共線」的情況就可以了。
凸包
一組二維點的「凸包」是一個最小的簡單凸多邊形,滿足多邊形內任意兩點的連線皆不會 經過多邊形外部,且所有給定的二維點也都不落在該多邊形外部。而在此題我們特別定義兩點 形成的連線、單一點也可以被當作凸包。
Input
輸入第一行有一個正整數N,代表二維平面上點的數量。
接著N 行,第i行包含兩個整數xi, yi,代表第i個點的座標為(xi, yi)。
• 2≤N ≤2000
• −109 ≤xi, yi ≤109
• 不會有兩個點的座標相同
• 保證任三點不共線
Output
若不存在任何合法的分組,輸出No於一行。否則,輸出Yes於首行,次行輸出一個長度 為N 的01字串,第i個字元代表第i個點分到的組別,也就是所有字元為0的分在一組、字 元為1的分在另一組。
任何一組滿足以下所有條件的輸出皆會獲得Accepted,否則會獲得Wrong Answer:
• 至少存在一個0。
• 至少存在一個1。
• 不存在一個實數點同時落在你分類好兩組點的兩個凸包內,且沒有任何給定的點嚴格落 在任何一個凸包內部。
Sample Input 1 Sample Output 1
6 0 4 1 3 1 1 3 2 2 0
Yes 000111
Sample Input 2 Sample Output 2 9
0 1 2 2 1 7 3 0 2 4 5 3 9 4 5 5 4 5
No
Sample Input 3 Sample Output 3
10 1 4 3 7 2 2 3 3 6 5 8 2 2 5 4 3 4 0 5 1
Yes
1011001010
Sample Input 4 Sample Output 4
3 0 0 0 1 1 0
Yes 011
This page is intentionally left blank.
D. 教授分球球
Problem ID: professor
你在比完了全國爬山大賽(National Pa Shan Contest,簡稱NPSC)之後,準備開心地返 家,但途中卻被多洛杜教授綁架了。你在昏迷一段時間後終於恢復意識,映入眼簾的是多洛杜 教授與一堆球。
多洛杜教授表示桌上總共有N 顆球排成一列,其中每顆球不是紅色就是白色,他要求你算 出有多少組正整數數對(l, r)滿足1≤l ≤ r≤ N 且從左數來第l 到第r球中,紅色球的個數要 和不在這範圍內的紅色球個數相同,白色球的個數也要和不在這範圍內的白色球個數相同。
多洛杜教授宣稱你只要回答正確,他就會放你離開,同時他也告訴你,他之所以綁架你的 原因,是因為他想用行動讓你體會到去比NPSC的人什麼都不會,只會爬山。
經 過 一 段 時 間 的 觀 察, 你 仍 然 沒 有 任 何 頭 緒, 因 此 多 洛 杜 教 授 決 定 大 發 慈 悲 的 告 訴 你一個提示。他告訴你 M 個正整數 a1, a2, . . . , aM,這些數字所代表的意義為從左數來會 先有連續 a1 顆紅球,再有 a2 顆白球,再有 a3 顆紅球,再有 a4 顆白球,以此類推,而且 N =a1+a2+· · ·+aM。
他相信即便在獲得這個關鍵提示之後,你仍然會做不出來。請利用這個提示,正確回答多 洛杜教授的問題,讓多洛杜教授知道比NPSC的人並不是只會爬山,還會解題。
Input
輸入的第一行包含一個正整數M。
接著第二行包含M 個正整數a1, a2, . . . , aM。
• 2≤M ≤106
• 1≤ai ≤109
Output
輸出一行,這行只有一個整數,代表多洛杜教授問題的答案。
Hint
範例測資一中,所有滿足條件的(l, r)為(1,5),(4,8),(5,9),(6,10)。
Sample Input 1 Sample Output 1
6
1 2 1 3 2 1
4
Sample Input 2 Sample Output 2
5
4 8 7 6 3
7
Sample Input 3 Sample Output 3
4
10 10 10 10
21
Sample Input 4 Sample Output 4
9
8 6 4 1 9 7 5 3 2
0
E. 真島與莉可麗絲
Problem ID: lycoris
NPSC 國在表面上看似很和平,但是這其實只是假象,事實上有一個專門無聲無息的將恐 怖份子擺平的神祕機構,而機構內負責行動的那群人被統稱為莉可麗絲(Lycoris),而一直被 莉可麗絲破壞恐攻計畫的恐怖份子首腦——真島,這次打算和他們一決死戰。
NPSC 國境內有N 座城市,編號為 1,2, . . . , N,總共恰有 N −1條從城市到城市的雙向高 速公路,而且任兩座城市之間恰有一條經過若干條高速公路的路徑連接彼此。
真島知道每座城市都有各自的莉可麗絲分部,因此真島大決戰計畫的第一部分,就是要炸 毀每條高速公路,讓每個分部都不能互相支援,這部分真島可以用特製的炸彈完成。對於任 兩座還互相連通的城市X, Y,一顆特製炸彈能同時炸毀連接城市X, Y 的路徑中的所有高速公 路。注意到一條高速公路被炸毀等同於這條高速公路未來不存在,因此原本能透過若干條高速 公路連接的兩座城市有可能會變得不連通。這些特製的炸彈還有一個大缺點,就是它們不能同 時引爆,不然會有連真島都不能預測的後果。
理論上高速公路用特製炸彈隨便炸一炸就可以了,但是真島希望能堅持自己的原則,他的 原則是要讓每個炸彈都恰好炸毀質數條高速公路。
你是真島的副手,因此他很理所當然的要你幫他想好一種使用炸彈的方法滿足他的原則,
或是告訴他如果要秉持自己原則,則一定炸不完所有的高速公路。
連通
兩座城市互相連通,代表可以從其中一座城市經過若干個未被炸毀的高速公路到達另一座 城市。
質數
一個正整數P 是質數若且唯若P > 1且P 只能被1和自己整除。
Input
輸入的第一行包含一個正整數T,代表接下來測試資料的筆數。
每一筆測試資料會有數行輸入。
其中第一行輸入一個正整數N,代表有N 座城市。
接下來輸入N−1行,其中第i行輸入兩個正整數ui, vi,代表有一條連接城市ui 和城市vi 的高速公路。
• 1≤T ≤100
• 2≤N ≤2×105
• 1≤ui, vi ≤N
• ui ̸=vi
• 對於任兩個i, j(1≤i < j ≤N)保證{ui, vi} ̸={uj, vj}
• 保證輸入的N −1條高速公路滿足題目敘述
• 保證這T 筆測試資料中,N 的總和不超過2×105
Output
對於每一筆測試資料,如果不存在滿足真島的原則的炸彈用法,則輸出一行,這行輸出
−1即可。否則第一行輸出一個正整數M(1≤M ≤N −1),代表要使用M 顆炸彈。
接下來輸出M 行,第i行輸出兩個正整數ai, bi(1≤ai, bi ≤N, ai ̸=bi),代表第i顆炸彈要 炸毀城市ai 到城市bi 路徑上的所有高速公路。記得每次炸毀的高速公路個數必須是質數。
如果存在多種可行的炸彈使用方案,輸出任意一種即可。注意到你不需要最小化炸彈的使 用量。
Sample Input 1 Sample Output 1 4
2 1 2 5 1 2 2 3 3 4 4 5 4 1 2 1 3 1 4 12 1 2 2 3 3 4 4 5 5 6 3 7 7 8 7 9 9 10 7 11 11 12
-1 2 1 3 3 5 -1 3 3 6 8 12 1 10
This page is intentionally left blank.
F. 城市規劃
Problem ID: grid
NPSC 國打算興建一座名為方格市的新城市。身為方格市第一任市長的方格王,規劃新城 市的任務自然地落到了他的手上。
在方格王的構想當中,這座城市最後的樣貌應該正如其名,是由排成 N 個東西向橫列與 M 個南北向直行的N×M 個方格組成。但是方格王認為直接建造N×M 個一模一樣的方格太 無聊了,他決定用有趣一點的方式建造:一開始城市是一個大方格,這個方格的「有趣度」是
0,且城市中沒有任何道路。接下來,他要建造N +M −2條道路,建造道路的方法分為以下
兩種:
1. 選擇一橫列的方格,建造一條東西向道路穿越這一列的所有方格,讓其中的每個方格分 為上下兩個方格。如果一個方格本來的有趣度是x,那麼分隔出的兩個方格有趣度則是 x+ 1。
2. 選擇一直行的方格,建造一條南北向道路穿越這一行的所有方格,讓其中的每個方格分 為左右兩個方格。如果一個方格本來的有趣度是x,那麼分隔出的兩個方格有趣度則是 x+ 1。
顯而易見地,方格王會使用第一種方法恰好 N −1次,以及使用第二種方法恰好M −1 次。
方格王開心地規劃了建造道路的方法和順序,並把結果的N ×M 個方格有趣度記錄下來,
然後就去睡覺了。隔天早上醒來,他完全不記得建造道路的順序應該要是什麼。這件事讓負責 建造城市的鯉魚王非常困擾,為了避免方格王生氣,請你幫鯉魚王找出一種建造道路的方式,
使得得出的所有方格的有趣度都和方格王規劃的一樣。
舉例來說,下圖是範例輸出一描述的建造過程中,方格市與其中每個方格的有趣度變化,
粗線是新建造的道路:
Input
輸入的第一行有兩個整數N, M,表示方格王規劃的方格市有N 列M 行。
接下來有N 行,其中第i行包含M 個非負整數ai,1, ai,2, . . . , ai,M,ai,j 表示第i列第j行的 方格的有趣度。
• 2≤N ×M ≤106
• 0≤ai,j ≤2×106
• 保證方格王不會出錯,一定存在至少一種滿足鯉魚王需求的建造道路的方式
Output
輸出 N +M −2行,其中第i行表示第i條要建造的道路是哪一條。一條道路以R x(x 是[1, N −1]內的整數)或C y(y是[1, M −1]內的整數)表示,R x表示最後規劃中第x列 和第x+1列方格之間的東西向道路、C y表示最後規劃中第 y行和第 y+1行方格之間的南北 向道路。
Sample Input 1 Sample Output 1 4 4
3 4 4 2 5 6 6 4 5 6 6 4 4 5 5 3
C 3 C 1 R 1 R 3 C 2 R 2
Sample Input 2 Sample Output 2
1 8
1 4 4 3 4 5 5 3
C 1 C 4 C 3 C 2 C 7 C 5 C 6
Sample Input 3 Sample Output 3
4 3 3 4 4 3 4 4 3 4 4 3 4 4
R 2 C 1 R 1 C 2 R 3
This page is intentionally left blank.
G. 魔族與訓練
Problem ID: mazoku
在經過幾場的挑戰後,魔法少女小桃認為魔族夏美子太弱了,沒有好好運用魔族的力量來 戰鬥,因此她決定要來訓練夏美子。透過各種戰鬥,能夠讓魔族更有效率的利用魔力,使她的 戰鬥能力變強。
魔族的魔力值可以用一個非負整數x來表示,由於夏美子是個新手魔族,她的魔力值有一 個正整數M 作為上限,即代表她的魔力值超過M 的部分會直接消失。
為了有效率的訓練夏美子,小桃準備了N 個關卡,其中第 i個關卡可用一個整數 ai 作為 它的難易度。根據難易度的不同,可將關卡分為以下兩類:
• 若ai >0,則代表這個關卡有一隻強度為ai 的怪物,夏美子的魔力值需至少為ai 才能完 成此關卡,且戰鬥完後夏美子的魔力值會減少ai。
• 若ai ≤0,則代表這個關卡是一個休息關卡,夏美子的魔力值會增加|ai|,然而若增加後 的魔力值超過上限 M,超過的部分還是會消失。
一場訓練會包含許多活動,活動一共有兩種類型:
• 為了讓訓練的效果更好,小桃將第p個關卡的難易度調整為x。這種類型叫做調整。
• 在夏美子魔力值為 y的時候,小桃會告訴夏美子一個關卡區間 [l, r],代表她需要依序完 成第l, l+ 1, . . . , r 個關卡。這種類型叫做闖關。
然而小桃發現在闖關的過程中,夏美子的魔力值可能會不夠導致無法完成。為了避免這種 情況發生,她為夏美子準備了許多可以隨時恢復魔力值的藥丸,每吃1顆藥丸她的魔力值就會 增加1,增加後的魔力值超過上限M 的部分依然會消失。
做為小桃的助手,小桃告訴你今天的訓練一共會有 Q個活動。然而因為藥丸價格不便宜,
對於每個闖關活動,小桃想要知道至少需要幾個藥丸才能保證夏美子能夠完成闖關。同時為了 事先了解每個闖關活動的成效,她也想知道在使用最少藥丸的情況下,完成闖關後的夏美子魔 力值是多少。請幫助小桃解決這個問題。
Input
首先輸入第一行包含三個正整數N, Q, M,代表小桃準備的關卡數量、今天訓練的活動數 量以及夏美子的魔力值上限。
接著輸入第二行包含 N 個整數a1, a2, . . . , aN,代表第i個關卡的難易度。
再來第三行到第Q+ 2行,每一行會代表一個訓練的活動。此行首先會有一個整數t,若 t= 1則代表此活動的類型為調整,且接下來會有兩個整數p, x。若t= 2則代表此活動的類型 為闖關,且接下來會有三個整數l, r, y。變數p, l, r, x, y的定義與題目敘述相同。
• 1≤N, Q≤3×105
• 1≤M ≤109
• −M ≤ai ≤M
• t ∈ {1,2}
• 1≤p≤N
• −M ≤x≤M
• 1≤l ≤r≤N
• 0≤y≤M
Output
對於每一個闖關活動,輸出一行,該行包含兩個整數,第一個為最少所需準備的藥丸數 量,第二個為在使用最少藥丸的情況下,完成闖關後夏美子的魔力值。
Notes
在範例測資一中,以下為第2個闖關活動的其中一個最佳策略:
1. 完成第1個關卡,魔力值變成10。 2. 完成第2個關卡,魔力值變成2。 3. 吃下2顆藥丸,魔力值變成4。 4. 完成第3個關卡,魔力值變成4。 5. 完成第4個關卡,魔力值變成0。
因此答案為2 0。
Sample Input 1 Sample Output 1
5 6 10 -4 8 0 4 -2 2 3 5 3 2 1 4 8 1 3 -1 2 3 5 3 2 1 4 8 2 1 5 0
1 2 2 0 0 2 1 0 7 2
Sample Input 2 5 1 1000000000
1000000000 -123456789 987654321 1000000000 -487638763 2 1 5 0
Sample Output 2 2864197532 487638763
Sample Input 3 Sample Output 3 12 12 12
0 9 -2 8 0 -3 2 5 -1 -1 0 -3 2 6 12 4
2 1 1 9 2 8 11 0 2 4 8 3 1 1 -2 2 5 6 10 1 4 1 2 4 7 2 2 8 9 1 1 8 9 1 2 -4 2 1 12 0
0 5 0 9 5 2 9 0 0 12 0 2 4 1 1 5
H. 買餅乾
Problem ID: cookie
小菫跟小薺是感情很好的一對姐妹,為了慶祝她們的四歲生日,她們決定到小橘開設的
「黑色薔薇」烘焙坊購買一些手工餅乾。手工餅乾每 M 片的售價為72.7元。在結帳時,若袋 中的餅乾數量並非M 的倍數,則小橘會視情況放入或取出一些餅乾,讓餅乾數量變為M 的倍 數。
具體來說,小橘會設定一個整數K,假設某袋餅乾一共有x塊,而x除以M 的餘數為r,
若r ≤K,則小橘會取出r塊餅乾;若r > K,則小橘會放入M −r塊餅乾,使得該袋餅乾的
數量變為M 的倍數。
身為姐姐的小菫,因為她沒有朋友,她打算把所有要買的餅乾放入同一個袋子中;而妹妹 小薺為了與朋友們分享餅乾,她打算把所有要買的餅乾分裝在N 個袋子,並且每個袋子裡至少 要有1塊餅乾。
在結帳前,聰明的小薺發現,即使兩人拿的餅乾總數相同,結帳時小橘調整餅乾數量的方 式也可能讓最後得到的餅乾數量有很大的差異!可愛的小菫想請你幫她們算算,若兩人拿的餅 乾總數相同,在怎樣的分裝方式下結帳後小菫得到的餅乾數量會比小薺多最多,而又是在怎樣 的分裝方式下結帳後小薺得到的餅乾數量會比小菫多最多呢?
以範例測資一為例,若小薺的三袋餅乾數量分別為 9,10,13塊,經過小橘調整後三袋餅乾 的數量分別將會變成7,7,14塊,一共有28塊;而小菫的袋子中則裝了9 + 10 + 13 = 32塊餅 乾,經過小橘調整後將變為35塊,小菫的餅乾數量比小薺多了35−28 = 7塊。可以證明無論 小薺怎麼拿餅乾,結帳後小菫的餅乾數量不可能比小薺多出8塊或更多。
若小薺的三袋餅乾數量分別為 5,11,22塊,經過小橘調整後三袋餅乾的數量分別將會變成 7,14,21塊,一共有42塊;而小菫的袋子中則裝了5 + 11 + 22 = 38塊餅乾,經過小橘調整後 將變為35塊,小薺的餅乾數量比小菫多了42−35 = 7塊。可以證明無論小薺怎麼拿餅乾,結 帳後小薺的餅乾數量不可能比小菫多出8塊或更多。
Input
輸入僅一行,包含三個整數N, M, K,分別以一個空白隔開。
• 2≤N ≤105
• 1≤M ≤109
• 0≤K < M
Output
輸出兩行,每行包含 N 個正整數,第i個整數表示小薺的第i個袋子中的餅乾數量。第一 行請輸出結帳後小菫的餅乾數量比小薺多最多的分裝方式;第二行請輸出結帳後小薺的餅乾數 量比小菫多最多的分裝方式。
由於小橘只烤了1018塊餅乾,每種分裝方式的餅乾數量總和不能超過1018。如果有多種分 裝方式,你可以輸出任意一種。
請注意,同一行兩個整數間請以一個空白隔開,並且每一行最後一個整數後不得有空白。
Sample Input 1 Sample Output 1
3 7 3 9 10 13
5 11 22
Sample Input 2 Sample Output 2
8 9 6 14 14 15 24 24 31 41 42
53 61 70 70 88 89 89 89