第六届团队程序设计天梯赛 全题目解析讲解
B站已經錄好視頻合集:--------------------傳送門---------------------
題目是2021年4月天梯賽決賽原題:
| L1-1 | 人與神 |
| L1-2 | 兩小時學完C語言 |
| L1-3 | 強迫癥 |
| L1-4 | 降價提醒機器人 |
| L1-5 | 大笨鐘的心情 |
| L1-6 | 吉老師的回歸 |
| L1-7 | 天梯賽的善良 |
| L1-8 | 乘法口訣數列 |
| L2-1 | 包裝機 |
| L2-2 | 病毒溯源 |
| L2-3 | 清點代碼庫 |
| L2-4 | 哲哲打游戲 |
| L3-1 | 森森旅游 |
| L3-2 | 還原文件 |
| L3-3 | 可憐的簡單題 |
AC代碼:
L1-1 人與神
跨界大神 L. Peter Deutsch 有一句名言:“To iterate is human, to recurse divine.”(迭代的是人,遞歸的是神)。本題就請你直接在屏幕上輸出這句話。
輸入格式:
本題沒有輸入。
輸出格式:
在一行中輸出 To iterate is human, to recurse divine.。
輸入樣例:
無
輸出樣例:
To iterate is human, to recurse divine.
L1-2 兩小時學完C語言
知乎上有個寶寶問:“兩個小時內如何學完 C 語言?”當然,問的是“學完”并不是“學會”。
假設一本 C 語言教科書有 N 個字,這個寶寶每分鐘能看 K 個字,看了 M 分鐘。還剩多少字沒有看?
輸入格式:
輸入在一行中給出 3 個正整數,分別是 N(不超過 400 000),教科書的總字數;K(不超過 3 000),是寶寶每分鐘能看的字數;M(不超過 120),是寶寶看書的分鐘數。
題目保證寶寶看完的字數不超過 N。
輸出格式:
在一行中輸出寶寶還沒有看的字數。
輸入樣例:
100000 1000 72
輸出樣例:
28000
L1-3 強迫癥
小強在統計一個小區里居民的出生年月,但是發現大家填寫的生日格式不統一,例如有的人寫 199808,有的人只寫 9808。有強迫癥的小強請你寫個程序,把所有人的出生年月都整理成 年年年年-月月 格式。對于那些只寫了年份后兩位的信息,我們默認小于 22 都是 20 開頭的,其他都是 19 開頭的。
輸入格式:
輸入在一行中給出一個出生年月,為一個 6 位或者 4 位數,題目保證是 1000 年 1 月到 2021 年 12 月之間的合法年月。
輸出格式:
在一行中按標準格式 年年年年-月月 將輸入的信息整理輸出。
輸入樣例 1:
9808
輸出樣例 1:
1998-08
輸入樣例 2:
0510
輸出樣例 2:
2005-10
輸入樣例 3:
196711
輸出樣例 3:
1967-11
L1-4 降價提醒機器人
小 T 想買一個玩具很久了,但價格有些高,他打算等便宜些再買。但天天盯著購物網站很麻煩,請你幫小 T 寫一個降價提醒機器人,當玩具的當前價格比他設定的價格便宜時發出提醒。
輸入格式:
輸入第一行是兩個正整數 N 和 M (1≤N≤100,0≤M≤1000),表示有 N 條價格記錄,小 T 設置的價格為 M。
接下來 N 行,每行有一個實數 Pi?(?1000.0<Pi?<1000.0),表示一條價格記錄。
輸出格式:
對每一條比設定價格 M 便宜的價格記錄 P,在一行中輸出 On Sale! P,其中 P 輸出到小數點后 1 位。
輸入樣例:
4 99
98.0
97.0
100.2
98.9
輸出樣例:
On Sale! 98.0
On Sale! 97.0
On Sale! 98.9
L1-5 大笨鐘的心情
有網友問:未來還會有更多大笨鐘題嗎?笨鐘回復說:看心情……
本題就請你替大笨鐘寫一個程序,根據心情自動輸出回答。
輸入格式:
輸入在一行中給出 24 個 [0, 100] 區間內的整數,依次代表大笨鐘在一天 24 小時中,每個小時的心情指數。
隨后若干行,每行給出一個 [0, 23] 之間的整數,代表網友詢問笨鐘這個問題的時間點。當出現非法的時間點時,表示輸入結束,這個非法輸入不要處理。題目保證至少有 1 次詢問。
輸出格式:
對每一次提問,如果當時笨鐘的心情指數大于 50,就在一行中輸出 心情指數 Yes,否則輸出 心情指數 No。
輸入樣例:
80 75 60 50 20 20 20 20 55 62 66 51 42 33 47 58 67 52 41 20 35 49 50 63
17
7
3
15
-1
輸出樣例:
52 Yes
20 No
50 No
58 Yes
L1-6 吉老師的回歸
曾經在天梯賽大殺四方的吉老師決定回歸天梯賽賽場啦!
為了簡化題目,我們不妨假設天梯賽的每道題目可以用一個不超過 500 的、只包括可打印符號的字符串描述出來,如:Problem A: Print “Hello world!”。
眾所周知,吉老師的競賽水平非常高超,你可以認為他每道題目都會做(事實上也是……)。因此,吉老師會按照順序看題并做題。但吉老師水平太高了,所以簽到題他就懶得做了(浪費時間),具體來說,假如題目的字符串里有 qiandao 或者 easy(區分大小寫)的話,吉老師看完題目就會跳過這道題目不做。
現在給定這次天梯賽總共有幾道題目以及吉老師已經做完了幾道題目,請你告訴大家吉老師現在正在做哪個題,或者吉老師已經把所有他打算做的題目做完了。
提醒:天梯賽有分數升級的規則,如果不做簽到題可能導致團隊總分不足以升級,一般的選手請千萬不要學習吉老師的酷炫行為!
輸入格式:
輸入第一行是兩個正整數 N,M (1≤M≤N≤30),表示本次天梯賽有 N 道題目,吉老師現在做完了 M 道。
接下來 N 行,每行是一個符合題目描述的字符串,表示天梯賽的題目內容。吉老師會按照給出的順序看題——第一行就是吉老師看的第一道題,第二行就是第二道,以此類推。
輸出格式:
在一行中輸出吉老師當前正在做的題目對應的題面(即做完了 M 道題目后,吉老師正在做哪個題)。如果吉老師已經把所有他打算做的題目做完了,輸出一行 Wo AK le。
輸入樣例 1:
5 1
L1-1 is a qiandao problem.
L1-2 is so…easy.
L1-3 is Easy.
L1-4 is qianDao.
Wow, such L1-5, so easy.
輸出樣例 1:
L1-4 is qianDao.
輸入樣例 2:
5 4
L1-1 is a-qiandao problem.
L1-2 is so easy.
L1-3 is Easy.
L1-4 is qianDao.
Wow, such L1-5, so!!easy.
輸出樣例 2:
Wo AK le
L1-7 天梯賽的善良
天梯賽是個善良的比賽。善良的命題組希望將題目難度控制在一個范圍內,使得每個參賽的學生都有能做出來的題目,并且最厲害的學生也要非常努力才有可能得到高分。
于是命題組首先將編程能力劃分成了 10^6個等級(太瘋狂了,這是假的),然后調查了每個參賽學生的編程能力。現在請你寫個程序找出所有參賽學生的最小和最大能力值,給命題組作為出題的參考。
輸入格式:
輸入在第一行中給出一個正整數 N(≤2×10^4 ),即參賽學生的總數。隨后一行給出 N 個不超過 10^6的正整數,是參賽學生的能力值。
輸出格式:
第一行輸出所有參賽學生的最小能力值,以及具有這個能力值的學生人數。第二行輸出所有參賽學生的最大能力值,以及具有這個能力值的學生人數。同行數字間以 1 個空格分隔,行首尾不得有多余空格。
輸入樣例:
10
86 75 233 888 666 75 886 888 75 666
輸出樣例:
75 3
888 2
L1-8 乘法口訣數列
本題要求你從任意給定的兩個 1 位數字 a1?和a2開始,用乘法口訣生成一個數列 {an?},規則為從a1?開始順次進行,每次將當前數字與后面一個數字相乘,將結果貼在數列末尾。如果結果不是 1 位數,則其每一位都應成為數列的一項。
輸入格式:
輸入在一行中給出 3 個整數,依次為 a1?、a2?和n,滿足 0≤a1?,a2?≤9,0<n≤10^3。
輸出格式:
在一行中輸出數列的前 n 項。數字間以 1 個空格分隔,行首尾不得有多余空格。
輸入樣例:
2 3 10
輸出樣例:
2 3 6 1 8 6 8 4 8 4
樣例解釋:
數列前 2 項為 2 和 3。從 2 開始,因為 2×3=6,所以第 3 項是 6。因為 3×6=18,所以第 4、5 項分別是 1、8。依次類推…… 最后因為第 6 項有 6×8=48,對應第 10、11 項應該是 4、8。而因為只要求輸出前 10 項,所以在輸出 4 后結束。
L2-1 包裝機
一種自動包裝機的結構如圖 1 所示。首先機器中有 N 條軌道,放置了一些物品。軌道下面有一個筐。當某條軌道的按鈕被按下時,活塞向左推動,將軌道盡頭的一件物品推落筐中。當 0 號按鈕被按下時,機械手將抓取筐頂部的一件物品,放到流水線上。圖 2 顯示了順序按下按鈕 3、2、3、0、1、2、0 后包裝機的狀態。
圖1 自動包裝機的結構
圖 2 順序按下按鈕 3、2、3、0、1、2、0 后包裝機的狀態
一種特殊情況是,因為筐的容量是有限的,當筐已經滿了,但仍然有某條軌道的按鈕被按下時,系統應強制啟動 0 號鍵,先從筐里抓出一件物品,再將對應軌道的物品推落。此外,如果軌道已經空了,再按對應的按鈕不會發生任何事;同樣的,如果筐是空的,按 0 號按鈕也不會發生任何事。
現給定一系列按鈕操作,請你依次列出流水線上的物品。
輸入格式:
輸入第一行給出 3 個正整數 N(≤100)、M(≤1000)和 Smax(≤100),分別為軌道的條數(于是軌道從 1 到 N 編號)、每條軌道初始放置的物品數量、以及筐的最大容量。隨后 N 行,每行給出 M 個英文大寫字母,表示每條軌道的初始物品擺放。
最后一行給出一系列數字,順序對應被按下的按鈕編號,直到 ?1 標志輸入結束,這個數字不要處理。數字間以空格分隔。題目保證至少會取出一件物品放在流水線上。
輸出格式:
在一行中順序輸出流水線上的物品,不得有任何空格。
輸入樣例:
3 4 4
GPLT
PATA
OMSA
3 2 3 0 1 2 0 2 2 0 -1
輸出樣例:
MATA
L2-2 病毒溯源
病毒容易發生變異。某種病毒可以通過突變產生若干變異的毒株,而這些變異的病毒又可能被誘發突變產生第二代變異,如此繼續不斷變化。
現給定一些病毒之間的變異關系,要求你找出其中最長的一條變異鏈。
在此假設給出的變異都是由突變引起的,不考慮復雜的基因重組變異問題 —— 即每一種病毒都是由唯一的一種病毒突變而來,并且不存在循環變異的情況。
輸入格式:
輸入在第一行中給出一個正整數 N(≤10^4 ),即病毒種類的總數。于是我們將所有病毒從 0 到 N?1 進行編號。
隨后 N 行,每行按以下格式描述一種病毒的變異情況:
k 變異株1 …… 變異株k
其中 k 是該病毒產生的變異毒株的種類數,后面跟著每種變異株的編號。第 i 行對應編號為 i 的病毒(0≤i<N)。題目保證病毒源頭有且僅有一個。
輸出格式:
首先輸出從源頭開始最長變異鏈的長度。
在第二行中輸出從源頭開始最長的一條變異鏈,編號間以 1 個空格分隔,行首尾不得有多余空格。如果最長鏈不唯一,則輸出最小序列。
注:我們稱序列 {a1 ,?,an } 比序列 { b1 ,?,bn} “小”,如果存在 1≤k≤n 滿足 ai=bi對所有 i<k 成立,且 ak<bk。
輸入樣例:
10
3 6 4 8
0
0
0
2 5 9
0
1 7
1 2
0
2 3 1
輸出樣例:
4
0 4 9 1
L2-3 清點代碼庫
上圖轉自新浪微博:“阿里代碼庫有幾億行代碼,但其中有很多功能重復的代碼,比如單單快排就被重寫了幾百遍。請設計一個程序,能夠將代碼庫中所有功能重復的代碼找出。各位大佬有啥想法,我當時就懵了,然后就掛了。。。”
這里我們把問題簡化一下:首先假設兩個功能模塊如果接受同樣的輸入,總是給出同樣的輸出,則它們就是功能重復的;其次我們把每個模塊的輸出都簡化為一個整數(在 int 范圍內)。于是我們可以設計一系列輸入,檢查所有功能模塊的對應輸出,從而查出功能重復的代碼。你的任務就是設計并實現這個簡化問題的解決方案。
輸入格式:
輸入在第一行中給出 2 個正整數,依次為 N(≤10^4)和 M(≤10^2),對應功能模塊的個數和系列測試輸入的個數。
隨后 N 行,每行給出一個功能模塊的 M 個對應輸出,數字間以空格分隔。
輸出格式:
首先在第一行輸出不同功能的個數 K。隨后 K 行,每行給出具有這個功能的模塊的個數,以及這個功能的對應輸出。數字間以 1 個空格分隔,行首尾不得有多余空格。輸出首先按模塊個數非遞增順序,如果有并列,則按輸出序列的遞增序給出。
注:所謂數列 { A1 , …, AM } 比 { B1 , …, BM} 大,是指存在 1≤i<M,使得 A1=B1 ,…,Ai=Bi成立,且 Ai+1>Bi+1。
輸入樣例:
7 3
35 28 74
-1 -1 22
28 74 35
-1 -1 22
11 66 0
35 28 74
35 28 74
輸出樣例:
4
3 35 28 74
2 -1 -1 22
1 11 66 0
1 28 74 35
L2-4 哲哲打游戲
哲哲是一位硬核游戲玩家。最近一款名叫《達諾達諾》的新游戲剛剛上市,哲哲自然要快速攻略游戲,守護硬核游戲玩家的一切!
為簡化模型,我們不妨假設游戲有 N 個劇情點,通過游戲里不同的操作或選擇可以從某個劇情點去往另外一個劇情點。此外,游戲還設置了一些存檔,在某個劇情點可以將玩家的游戲進度保存在一個檔位上,讀取存檔后可以回到劇情點,重新進行操作或者選擇,到達不同的劇情點。
為了追蹤硬核游戲玩家哲哲的攻略進度,你打算寫一個程序來完成這個工作。假設你已經知道了游戲的全部劇情點和流程,以及哲哲的游戲操作,請你輸出哲哲的游戲進度。
輸入格式:
輸入第一行是兩個正整數 N 和 M (1≤N,M≤10^5),表示總共有 N 個劇情點,哲哲有 M 個游戲操作。
接下來的 N 行,每行對應一個劇情點的發展設定。第 i 行的第一個數字是 Ki?,表示劇情點 i 通過一些操作或選擇能去往下面 Ki?個劇情點;接下來有 Ki?個數字,第 k 個數字表示做第 k 個操作或選擇可以去往的劇情點編號。
最后有 M 行,每行第一個數字是 0、1 或 2,分別表示:
0 表示哲哲做出了某個操作或選擇,后面緊接著一個數字 j,表示哲哲在當前劇情點做出了第 j 個選擇。我們保證哲哲的選擇永遠是合法的。
1 表示哲哲進行了一次存檔,后面緊接著是一個數字 j,表示存檔放在了第 j 個檔位上。
2 表示哲哲進行了一次讀取存檔的操作,后面緊接著是一個數字 j,表示讀取了放在第 j 個位置的存檔。
約定:所有操作或選擇以及劇情點編號都從 1 號開始。存檔的檔位不超過 100 個,編號也從 1 開始。游戲默認從 1 號劇情點開始。總的選項數(即 ∑Ki?)不超過 10^6。
輸出格式:
對于每個 1(即存檔)操作,在一行中輸出存檔的劇情點編號。
最后一行輸出哲哲最后到達的劇情點編號。
輸入樣例:
10 11
3 2 3 4
1 6
3 4 7 5
1 3
1 9
2 3 5
3 1 8 5
1 9
2 8 10
0
1 1
0 3
0 1
1 2
0 2
0 2
2 2
0 3
0 1
1 1
0 2
輸出樣例:
1
3
9
10
樣例解釋:
簡單給出樣例中經過的劇情點順序:
1 -> 4 -> 3 -> 7 -> 8 -> 3 -> 5 -> 9 -> 10。
檔位 1 開始存的是 1 號劇情點;檔位 2 存的是 3 號劇情點;檔位 1 后來又存了 9 號劇情點。
// s[i][j] = k 表示在 劇情點i的第j個選擇是通向劇情k的 // vector <int> s[100000 + 10]; #include <bits/stdc++.h> using namespace std; const int Maxn = 100000 + 10; int n, m, now = 1; int rec[110]; vector <int> vec[Maxn]; int main() {scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++) {int k;scanf("%d", &k);for(int j = 1; j <= k; j++) {int v;scanf("%d", &v);vec[i].push_back(v); // vec[1][0] = 2, vec[1][1] = 3 ...}}for(int i = 1; i <= m; i++) {int a, b;scanf("%d%d", &a, &b);if(a == 0) {// now 現在的劇情點 // vec[now][b - 1] 將要到達的劇情點now = vec[now][b - 1]; }else if(a == 1) {printf("%d\n", now);rec[b] = now;}else if(a == 2) {now = rec[b];}}printf("%d", now);return 0; }L3-1 森森旅游
好久沒出去旅游啦!森森決定去 Z 省旅游一下。
Z 省有 n 座城市(從 1 到 n 編號)以及 m 條連接兩座城市的有向旅行線路(例如自駕、長途汽車、火車、飛機、輪船等),每次經過一條旅行線路時都需要支付該線路的費用(但這個收費標準可能不止一種,例如車票跟機票一般不是一個價格)。
Z 省為了鼓勵大家在省內多逛逛,推出了旅游金計劃:在 i 號城市可以用 1 元現金兌換 ai?元旅游金(只要現金足夠,可以無限次兌換)。城市間的交通即可以使用現金支付路費,也可以用旅游金支付。具體來說,當通過第 j 條旅行線路時,可以用 cj元現金或 dj元旅游金支付路費。注意: 每次只能選擇一種支付方式,不可同時使用現金和旅游金混合支付。但對于不同的線路,旅客可以自由選擇不同的支付方式。
森森決定從 1 號城市出發,到 n 號城市去。他打算在出發前準備一些現金,并在途中的某個城市將剩余現金 全部 換成旅游金后繼續旅游,直到到達 n 號城市為止。當然,他也可以選擇在 1 號城市就兌換旅游金,或全部使用現金完成旅程。
Z 省政府會根據每個城市參與活動的情況調整匯率(即調整在某個城市 1 元現金能換多少旅游金)。現在你需要幫助森森計算一下,在每次調整之后最少需要攜帶多少現金才能完成他的旅程。
輸入格式:
輸入在第一行給出三個整數 n,m 與 q(1≤n≤10^5, 1≤m≤2×10 ^5,1≤q≤10 ^5),依次表示城市的數量、旅行線路的數量以及匯率調整的次數。
接下來 m 行,每行給出四個整數 u,v,c 與 d(1≤u,v≤n,1≤c,d≤10^9),表示一條從 u 號城市通向 v 號城市的有向旅行線路。每次通過該線路需要支付 c 元現金或 d 元旅游金。數字間以空格分隔。輸入保證從 1 號城市出發,一定可以通過若干條線路到達 n 號城市,但兩城市間的旅行線路可能不止一條,對應不同的收費標準;也允許在城市內部游玩(即 u 和 v 相同)。
接下來的一行輸入 n 個整數 a1,a2,?,an(1≤ai≤10^9),其中 ai表示一開始在 i 號城市能用 1 元現金兌換ai個旅游金。數字間以空格分隔。
接下來 q 行描述匯率的調整。第 i 行輸入兩個整數 xi與ai′(1≤xi≤n,1≤ai′≤10^9),表示第 i 次匯率調整后,xi號城市能用 1 元現金兌換 ai′?個旅游金,而其它城市旅游金匯率不變。請注意:每次匯率調整都是在上一次匯率調整的基礎上進行的。
輸出格式:
對每一次匯率調整,在對應的一行中輸出調整后森森至少需要準備多少現金,才能按他的計劃從 1 號城市旅行到 n 號城市。
再次提醒:如果森森決定在途中的某個城市兌換旅游金,那么他必須將剩余現金全部、一次性兌換,剩下的旅途將完全使用旅游金支付。
輸入樣例:
6 11 3
1 2 3 5
1 3 8 4
2 4 4 6
3 1 8 6
1 3 10 8
2 3 2 8
3 4 5 3
3 5 10 7
3 3 2 3
4 6 10 12
5 6 10 6
3 4 5 2 5 100
1 2
2 1
1 17
輸出樣例:
8
8
1
樣例解釋:
對于第一次匯率調整,森森可以沿著 1→2→4→6 的線路旅行,并在 2 號城市兌換旅游金;
對于第二次匯率調整,森森可以沿著 1→2→3→4→6 的線路旅行,并在 3 號城市兌換旅游金;
對于第三次匯率調整,森森可以沿著 1→3→5→6 的線路旅行,并在 1 號城市兌換旅游金。
// 迪杰斯特拉算法: 求一個點到其他所有點的距離(n^2)(優先隊列優化,n*logn) // 本題題意要的解法: 至少要求出點1到其他所有點的距離(n*logn)。 // 再求出每個點到點n的距離..(建立反向邊, 改成了求點n到其他點的距離) // 對于每個點ui就都能求出:到 點ui時的花費現金數量qi, 點ui到點n花費的旅游金數量pi ,至少要帶qi+[pi/ai] ([]表示向上取整) // 鄰接表建邊、迪杰斯特拉算法、會使用優先隊列、pair類型的使用 // 高等數據結構:線段樹 (修改操作是logn(單點修改,不是區間修改),查詢操作也是logn,單獨查詢最小值的話是1) // 查詢的復雜度就降低成了 q*logn// 題目整體復雜度 max(n * logn, q * logn), n和q是等階的 #include <bits/stdc++.h> using namespace std; const int Maxn = 100000 + 10; const int Maxm = 200000 + 20; int n, m, t; long long tree[Maxn << 2]; // 記錄到達每個點的花費,同時也能記錄一段區間的最小花費 int a[Maxn]; int ecnt, head[Maxn]; int cecnt, chead[Maxn]; long long dis[Maxn], cdis[Maxn]; // dis[i]表示點1到點i的距離 cdisn[i] 表示點n到點i的距離(反向邊) bool vis[Maxn]; //表示點i是否作為最短路點進行了對其他點最短路的更新 typedef pair<long long, int> pii; priority_queue <pii, vector<pii>, greater<pii> > q; // 聲明好了一個按最小值排序的小頂堆(也就是優先隊列) struct list {int to, nxt, w; }e[Maxm], ce[Maxm]; void add_edge(int u, int v, int w) {e[++ecnt].to = v;e[ecnt].w = w;e[ecnt].nxt = head[u];head[u] = ecnt; } void add_cedge(int u, int v, int w) {ce[++cecnt].to = v;ce[cecnt].w = w;ce[cecnt].nxt = chead[u];chead[u] = cecnt; } void build_tree(int cur, int l, int r) {if(l == r) {if(dis[l] == 1e18 || cdis[l] == 1e18) tree[cur] = 2e18;else tree[cur] = dis[l] + (cdis[l] / a[l] + (cdis[l] % a[l] != 0)); return;}int mid = l + r >> 1;build_tree(cur << 1, l, mid);build_tree(cur << 1 | 1, mid + 1, r);tree[cur] = min(tree[cur << 1], tree[cur << 1 | 1]); }void modify(int cur, int l, int r, int tar, int val) {if(l == r) {a[l] = val;if(dis[l] == 1e18 || cdis[l] == 1e18) tree[cur] = 2e18;else tree[cur] = dis[l] + (cdis[l] / a[l] + (cdis[l] % a[l] != 0)); return;}int mid = l + r >> 1;if(tar <= mid) modify(cur << 1, l, mid, tar, val);else modify(cur << 1 | 1, mid + 1, r, tar, val);tree[cur] = min(tree[cur << 1], tree[cur << 1 | 1]); }int main() {scanf("%d%d%d", &n, &m, &t);for(int i = 1; i <= m; i++) {int u, v, w1, w2;scanf("%d%d%d%d", &u, &v, &w1, &w2);add_edge(u, v, w1);add_cedge(v, u, w2);}for(int i = 1; i <= n; i++) scanf("%d", &a[i]);for(int i = 1; i <= n; i++) dis[i] = cdis[i] = 1e18;dis[1] = 0;q.push(make_pair(dis[1], 1));while(!q.empty()) {int x = q.top().second;q.pop();if(vis[x]) continue;vis[x] = true;for(int i = head[x]; i; i = e[i].nxt)if(dis[x] + e[i].w < dis[e[i].to]) {dis[e[i].to] = dis[x] + e[i].w;q.push(make_pair(dis[e[i].to], e[i].to));}} for(int i = 1; i <= n; i++) vis[i] = false;cdis[n] = 0;q.push(make_pair(dis[n], n));while(!q.empty()) {int x = q.top().second;q.pop();if(vis[x]) continue;vis[x] = true;for(int i = chead[x]; i; i = ce[i].nxt)if(cdis[x] + ce[i].w < cdis[ce[i].to]) {cdis[ce[i].to] = cdis[x] + ce[i].w;q.push(make_pair(cdis[ce[i].to], ce[i].to));}} // for(int i = 1; i <= n; i++) printf("點1到達點%d的距離是:%lld,點%d到達點n的距離是:%lld\n", i, dis[i], i, cdis[i]);build_tree(1, 1, n);for(int i = 1; i <= t; i++) {int x, a_;scanf("%d%d", &x, &a_);modify(1, 1, n, x, a_);printf("%lld\n", tree[1]);}return 0; }L3-2 還原文件
一份重要文件被撕成兩半,其中一半還被送進了碎紙機。我們將碎紙機里找到的紙條進行編號,如圖 1 所示。然后根據斷口的折線形狀跟沒有切碎的半張紙進行匹配,最后還原成圖 2 的樣子。要求你輸出還原后紙條的正確拼接順序。
圖1 紙條編號
圖2 還原結果
輸入格式:
輸入首先在第一行中給出一個正整數 N(1<N≤10^5),為沒有切碎的半張紙上斷口折線角點的個數;隨后一行給出從左到右 N 個折線角點的高度值(均為不超過 100 的非負整數)。
隨后一行給出一個正整數 M(≤100),為碎紙機里的紙條數量。接下去有 M 行,其中第 i 行給出編號為 i(1≤i≤M)的紙條的斷口信息,格式為:K h[1] h[2] … h[K]其中 K 是斷口折線角點的個數(不超過 10^4+1),后面是從左到右 K 個折線角點的高度值。為簡單起見,這個“高度”跟沒有切碎的半張紙上斷口折線角點的高度是一致的。
輸出格式:
在一行中輸出還原后紙條的正確拼接順序。紙條編號間以一個空格分隔,行首尾不得有多余空格。
題目數據保證存在唯一解。
輸入樣例:
17
95 70 80 97 97 68 58 58 80 72 88 81 81 68 68 60 80
6
4 68 58 58 80
3 81 68 68
3 95 70 80
3 68 60 80
5 80 72 88 81 81
4 80 97 97 68
輸出樣例:
3 6 1 5 2 4
L3-3 可憐的簡單題
九條可憐去年出了一道題,導致一眾參賽高手慘遭團滅。今年她出了一道簡單題 —— 打算按照如下的方式生成一個隨機的整數數列 A:
1.最開始,數列 A 為空。
2.可憐會從區間 [1,n] 中等概率隨機一個整數 i 加入到數列 A 中。
3.如果不存在一個大于 1 的正整數 w,滿足 A 中所有元素都是 w 的倍數,數組 A 將會作為隨機生成的結果返回。否則,可憐將會返回第二步,繼續增加 A 的長度。
現在,可憐告訴了你數列 n 的值,她希望你計算返回的數列 A 的期望長度。
輸入格式:
輸入一行兩個整數 n,p (1≤n≤10^11,n<p≤10 ^12 ),p 是一個質數。
輸出格式:
在一行中輸出一個整數,表示答案對 p 取模的值。具體來說,假設答案的最簡分數表示為x/y ,你需要輸出最小的非負整數 z 滿足 y×z≡x mod p。
輸入樣例 1:
2 998244353
輸出樣例 1:
2
輸入樣例 2:
100000000 998244353
輸出樣例 2:
3056898
(1分代碼)
(滿分代碼):大神的代碼
有不懂的問題歡迎評論哦
總結
以上是生活随笔為你收集整理的第六届团队程序设计天梯赛 全题目解析讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王者服务器维护8月四日,王者荣耀体验服弈
- 下一篇: 幼儿园不同空间翻新设计注意事项