[Codeforces is All You Need] CR 833 ABC (1748ABC) - Solution
這是ABC的合集題解

問題簡(jiǎn)述
????????Problem A:給定,計(jì)算使用大小為
(每個(gè)
各有一個(gè))的方塊能拼出的最大的正方形。
????????Problem B:給定一個(gè)長度為的數(shù)字串
,求其所有“多樣”的子串。一個(gè)子串“多樣”意味著其中所有的數(shù)字出現(xiàn)的次數(shù)不超過該子串中不同數(shù)字的數(shù)目。
????????Problem C:給定一個(gè)長度為的序列
,現(xiàn)在可以將其中的
變成任意整數(shù)。求變化后最多有多少個(gè)
前綴序列之和為
。
????????原比賽鏈接:https://codeforces.com/contest/1748
思路
????????Problem A:答案就是。首先說明只有邊長
的正方形才可行:不難發(fā)現(xiàn)
(真的不難發(fā)現(xiàn),就是簡(jiǎn)單的分類討論,然后等差數(shù)列求和),由此可行的正方形邊長不會(huì)超過。也不難構(gòu)造出一個(gè)邊長為
的解:取一個(gè)
的方塊;此外大小為
和大小為
的方塊拼一起作為一組(
);總共得到恰好
組。證畢。
????????Problem B:由于一共就只有這10個(gè)數(shù)字,因此實(shí)際上符合要求的子串長度不超過
。直接暴力判斷的復(fù)雜度為
,略高了。可以使用前綴和優(yōu)化(統(tǒng)計(jì)不同數(shù)字出現(xiàn)次數(shù)的前綴和,這樣可以在
內(nèi)計(jì)算每個(gè)數(shù)字出現(xiàn)了多少次),這樣復(fù)雜度為
。
????????Problem C:(貪心)對(duì)于前綴和序列,不難發(fā)現(xiàn),(1)當(dāng)我們將
調(diào)整為任意其它整數(shù)時(shí),等價(jià)于把
同時(shí)增加了某個(gè)整數(shù)。另一個(gè)重要的發(fā)現(xiàn)是,(2)如果我們調(diào)整了
,如果存在
,那么
的調(diào)整對(duì)
并沒有影響(因?yàn)檎{(diào)整是任意的)。于是,對(duì)于
,我們只需要貪心地考慮
下標(biāo)對(duì)應(yīng)的前綴和(其中
是
之后第一個(gè)為
的元素的位置;如果
已經(jīng)是最后一個(gè)了,那么
)。根據(jù)(1)的結(jié)果,這時(shí)候最佳的貢獻(xiàn)應(yīng)該是該下標(biāo)區(qū)間內(nèi)出現(xiàn)最多的前綴和值。使用std::map就可以輕松地統(tǒng)計(jì)每個(gè)前綴和值出現(xiàn)的次數(shù)??偟膹?fù)雜度為
。如果用hash表會(huì)更快一點(diǎn)。另外,不要忘記統(tǒng)計(jì)第一個(gè)
之前的前綴和中值為
的個(gè)數(shù)!(因?yàn)檫@個(gè)WA了幾發(fā)。)
后記
????????因?yàn)橐恍┰?,沒錄上屏? :(
????????代碼會(huì)上傳到github:https://github.com/cnzzx/AlgorithmCompetitions。
????????D題把奇數(shù)的情形解決了,但是沒搗鼓出偶數(shù)的情形,看了題解覺得確實(shí)差了一點(diǎn),沒從最低的二進(jìn)制位考慮過。
????????附上codeforces官方題解鏈接:https://codeforces.com/blog/entry/108319