有一款被譽為考驗智慧嘅紙牌遊戲,叫做「แคง (Kang)」。喺呢個遊戲入面,每張牌都有一個正整數分數。遊戲開始嗰陣,你會收到 $N$ 張牌攞喺手度,而檯面仲有另外 $M$ 張牌打開咗由左至右排好。你可以睇到所有牌嘅分數,包括你手上收到嘅牌同埋擺喺檯面嘅牌。跟住,你可以由檯面再摸多 $k$ 輪牌,每次一定要由左至右順序摸一張。喺每一輪摸牌之後,你可以棄 1 次手牌:將手上面任意數量而且分數一樣嘅牌一齊揼走。你要計劃好點玩,令到喺檯面摸牌同埋棄手牌足足 $k$ 輪之後,手上面淨低嘅牌嘅總分愈細愈好。
考慮下面嘅例子:
假設一開始你手上有五張牌,分數係 $6, 3, 9, 6, 3$,而擺喺檯面由左至右嘅牌分數係 $4, 6, 9, 6$。
情況 $k = 1$:如果你只可以喺檯面摸 1 張牌,當你摸咗第一張牌之後,你擁有嘅牌嘅分數會變成 $6, 3, 9, 6, 3, 4$。跟住你可以揀將分數相同嘅牌揼走 1 次。最好嘅做法係揀將 2 張分數係 $6$ 嘅牌揼走,令淨低嘅牌嘅總分去到最細值 $3 + 9 + 3 + 4 = 19$。
情況 $k = 2$:如果你可以喺檯面摸 2 張牌,最好嘅方法係:摸咗第一張分數係 $4$ 嘅牌之後,你揀揼走一張分數係 $9$ 嘅牌,手上面淨低嘅牌分數係 $6, 3, 6, 3, 4$。跟住當摸第 2 張分數係 $6$ 嘅牌嗰陣,你可以揼走 3 張分數係 $6$ 嘅牌,令淨低嘅牌嘅總分最細,等於 $3 + 3 + 4 = 10$。
情況 $k = 3$:如果你可以喺檯面摸 3 張牌,最好嘅方法係:當你摸咗第一張牌之後,手上面嘅牌分數會係 $6, 3, 9, 6, 3, 4$。跟住揀將分數相同嘅牌揼走 1 次,最好嘅做法係將 2 張分數係 $3$ 嘅牌全部揼晒,手上面會淨低 $6, 9, 6, 4$。跟住當摸第 2 張分數係 $6$ 嘅牌嗰陣,你可以揼走 3 張分數係 $6$ 嘅牌,手上面會有 $9, 4$。而當你第 3 次摸分數係 $9$ 嘅牌嗰陣,你可以將 2 張分數係 $9$ 嘅牌全部揼晒,令淨低嘅牌嘅總分變成 $4$。
情況 $k = 4$:如果你可以喺檯面摸 4 張牌,最好嘅方法係:摸咗第一張分數係 $4$ 嘅牌之後,揀揼走一張分數係 $4$ 嘅牌,手上面淨低嘅牌分數係 $6, 3, 9, 6, 3$。跟住第 2 次摸嘅牌分數係 $6$,最好嘅做法係將 2 張分數係 $3$ 嘅牌全部揼晒,手上面淨低 $6, 9, 6, 6$。第 3 次摸嘅牌分數係 $9$,揀將 2 張分數係 $9$ 嘅牌全部揼晒。最後摸最尾一張分數係 $6$ 嘅牌嗰陣,你可以揼走 4 張分數係 $6$ 嘅牌。呢次棄牌之後手上面一張牌都冇淨,即係話牌嘅總分係 $0$。
你嘅任務(Your Task)
對於 $k = 1, 2, 3, \ldots, M$,搵出完成 $k$ 輪之後「手上面淨低嘅牌嘅最細總分」。
呢題嘅寫程式格式同平時嘅格式唔同,而呢種格式會喺正式比賽度用。請睇呢題最尾部分關於點樣使用嘅說明。
實作細節
你要寫下面呢個函數:
std::vector<long long> capsize(std::vector<int> A, std::vector<int> B)
參數包括:
- $A$ 係一個長度為 $N$ 嘅陣列,指明一開始手上面嘅牌嘅編號。
- $B$ 係一個長度為 $M$ 嘅陣列,按由左至右順序指明擺喺檯面嘅牌嘅編號。
- 呢個函數要回傳一個長度為 $M$ 嘅陣列 $C$,代表當 $k = 1, 2, 3, \ldots, M$ 嗰陣,經過 $k$ 輪之後手上面嘅牌可以達到嘅最細分數總和。
例如,如果 $A = [6, 3, 9, 6, 3]$ 同埋 $B = [4, 6, 9, 6]$,函數就要回傳陣列 $[19, 10, 4, 0]$。
資料範圍
- $1 \le N, M \le 10^6$
- 對於每個滿足 $1 \le i \le N$ 嘅 $i$,都有 $1 \le A[i] \le 10^9$
- 對於每個滿足 $1 \le i \le M$ 嘅 $i$,都有 $1 \le B[i] \le 10^9$
子任務
| 測試資料組別 | 呢組測試資料嘅最高分數 | 條件 |
|---|---|---|
| 1 | 5% | $N, M \le 5$ |
| 2 | 7% | $N \le 1\,000$ 而且 $M = 1$ |
| 3 | 8% | $N, M \le 1\,000$,所有牌(包括手上嘅牌同檯面展示嘅牌)嘅編號全部唔同 |
| 4 | 12% | $N, M \le 1\,000$,所有額外摸返嚟嘅牌數值全部一樣 |
| 5 | 16% | $N, M \le 1\,000$ |
| 6 | 28% | $N, M \le 100\,000$ |
| 7 | 24% | 冇額外限制條件 |
說明
寫程式指引
喺呢一題入面,寫程式同埋交程式去評測系統(Grader)嘅方法,同一般要求參賽者自己寫讀取輸入同埋輸出結果嘅格式唔同。喺呢題度,參賽者只需要喺指定嘅函數入面寫必要嘅計算部分。所有輸入資料都可以透過函數嘅參數攞到,而計算結果亦都要透過函數回傳返出去。參賽者唔使寫讀取輸入嘅部分,亦都唔使寫輸出結果嘅部分。
參賽者會收到下面幾個檔案。參賽者只需要按照題目要求修改唯一一個檔案,然後將嗰個檔案交上系統:
grader.cpp係負責讀取輸入同埋輸出結果嘅主檔案。kang.cpp係參賽者要寫各種計算程式嘅檔案,亦係參賽者要交上系統嘅檔案(喺kang.cpp入面唔可以有main()函數,但係可以有其他函數)。run_cpp.sh係參賽者可以用嚟執行成個程式嘅檔案。compile_cpp.sh係參賽者可以用嚟編譯程式嘅檔案。
參賽者會收到一個可以喺系統下載嘅 .zip 檔案,解壓縮(extract)之後會有齊上面 4 個檔案。參賽者應該用 text editor 或者 IDE 嚟修改 kang.cpp,並且透過呼叫 compile_cpp.sh 或者 run_cpp.sh 嚟編譯或者執行程式。
當參賽者呼叫 run_cpp.sh 嚟執行程式嗰陣,程式會按照 grader.cpp 入面寫明嘅方式運作,而「評測器檔案說明」一節解釋咗嗰個檔案嘅運作原理。