noi.ac系列NOIP2018模擬賽參賽實錄
已更新到2018.9.23:第六場比賽
被教練要求去參加這個比賽,結果被錘爆…難道我OI生涯的最後一年要晚節不保了麼…
題目質量非常不錯,思維很廣闊,出題人陣容很強大,難度比NOIP稍高,但並沒有到很省選的水平,所以還是我太菜了啊…
比賽網址:noi.ac
**注意,這裡寫的是本人的參賽實錄,可能並不包含題目真正的題解!**
2018.9.8 Day1
T1 Candy
題目大意: 兩個數列,每個數列中有個數,要從中取數,取一個數有的代價,收益為在中取的數的和,與在中取的數的和,這兩個和的最小值。求收益-代價的最大值。
我的思路:
可以肯定的是,最優解中中取的數一定都是對應最大的。那麼我們先列舉哪一邊是最小值,然後在兩邊用兩個指標進行計算,因為收益是最小值,所以另一邊只要達到列舉的最小值就不再繼續了,因此是最優的,於是我們就解決了這一題。
這道題我在場上就拿到了滿分。
T2 Sort
題目大意: 給定長為的一個序列,可以進行區間翻轉操作,翻轉區間的代價是。構造出一種操作方案使得代價不超過,並使得操作後序列中的數字按照從小到大的順序排列。
我的思路: 我在場上寫了的暴力拿了65分,然後在考試結束前半個小時想到了(疑似)正解,可惜碼力實在不夠寫不出來。
正解的思路大概是從序列中只有或的特殊性質入手。考慮分治,每次的意圖是把湊在區間的右邊。先遞迴處理左半和右半區間,然後處理當前區間時,只需要一次翻轉把左半區間的湊到右邊即可。顯然這樣的代價不超過,所以直接模擬翻轉操作,時間複雜度就是。
當序列是任意序列時,可以借用快速排序的思想,選定一箇中間點,然後把比它小的放前面,否則放後面。選中間點就是的了,而這個放置的過程,實際上我們只要給比中間點小的數標,否則標,就和上面的特殊性質一模一樣了。於是外層用快速排序的分治,對於每個區間的排列也分治,這樣代價就不超過,時間複雜度也同樣了。
T3 MST
題目大意: 給定一棵生成樹的邊權集合,求有多少點數為的,邊權在中的,不同邊邊權不同的無向完全圖,滿足存在邊權集合為給定集合的最小生成樹。
我的思路: 這題我在考場上只想出了邊權集合為到的方法…
我們知道Cayley定理:無向完全圖的帶標號生成樹數目是。而當邊權集合為到時,顯然我們只需要列舉生成樹的位置,其他的邊無論怎麼填都不會影響最小生成樹的位置。於是答案就是。
本來可以拿到40分的,結果傻逼了忘記取模,爆成10分…
其實我考場上有一個思路和正解的思路非常接近,但很遺憾沒有時間細想下去。按Kruskal的思想從小到大填邊,在填一條樹邊的時候,一定要是連線原來分開的兩個連通塊,反之,則一定是在原來的某個連通塊中連。注意到這個過程僅和所有點的連通塊的狀態有關,並且並不用求出真的連通狀態,只需要表達出各大小的連通塊的數量就行了。這樣的狀態數有多少個呢?注意到這就是整數拆分數,打表可知大約為多。接著就可以按照上面的方法轉移了,不過好像還要優化,因為我還沒細想,所以就先到這裡吧。
第一天我的分數是100+65+10=175,有諸多遺憾,甚至一度認為自己連NOIP都考不出來了…不過這些題目也是很好地開闊了我的思維,受教了。
2018.9.9 Day2
T1 Palindrome
題目大意: 定義一個字串的迴文拆分為,將其拆分成段,使得第和第段,第和第段…都相等。對每個字串,求最大的。
我的思路: 由於考試策略的原因,這道題我是在最後寫的…
我們需要一個結論:在進行兩端的分割的時候,一定是割出最短的合法相等子串是最優的。這個可以用反證法自己證明。然後我們就可以用字串雜湊做到了。
然而考場上我非常傻逼地寫了一個KMP只拿了70…太毒了…
T2 String
題目大意: 有一個長為的只包含四個字母的字串,每次操作可以交換兩個相鄰字元,也可以在給定的個操作中選擇一個,這些操作的形式都是把某一個特定的子串換成長度相等的另一個子串,也是隻包含四個字母。求一個操作序列,使得途中經過的不同字串的數量最多,輸出這個數量。
我的思路: 首先,由於可以交換字元,所以當字元的數量相等時,不同的字串可以相互轉換,因此我們就可以用這樣的狀態表示有個,個…的字串集合。而因為字串長度總是不變,因此可以省掉一維。
接下來,因為可以交換字元,所以只要字元數達到要求,就一定可以交換出一個可以進行操作的子串,用這樣的要求去判斷和連邊即可。
連完邊之後,我們發現可能有環,因此進行SCC縮點,然後對得到的有向圖做拓撲序DP,找到帶權最長路即可。
要注意的是,答案可能超過long long的範圍,但不會超過兩個long long拼起來的範圍,因此要使用一些玄學操作來進行計算。反正我不太會…所以在考場上只得到了80分。
T3 BST
題目大意: 有一棵有個葉子節點的完全二叉樹,葉子一開始從左到右編號為到,非葉子節點從上到下分層,第層從左到右編號為到。現在有次操作,一個是給定一個區間,依次交換點到點的左右子樹。另一個是詢問現在從左到右第個葉子節點的編號。要注意的是,葉子節點的編號是隨著旋轉而變化的,而非葉子節點的編號單純按位置來定。
我的思路: 正解用線段樹,暫時不是很會,只寫了60分的部分分。
首先30分可以暴力模擬…就不說了。然後我做的是特殊性質,注意到如果把點的編號化成二進位制串,那麼題中的樹就是一棵trie,而對於區間進行操作,實際上就是把第到第層的索引交換了,因此在找的時候如果這一層的索引被交換了奇數次,就往反方向走就行了。
這次比賽考得就不錯了,70+80+60=210,得到了第三名,雖然也有點遺憾(第一題傻逼了),但還是考出了應有的水平(?)吧。
2018.9.15 Day3
T1 列隊
題目大意: 將到的排列填在一個的方陣中,個詢問,每次詢問一對,表示詢問有多少個數在當前行是第大,在當前列是第大。
我的思路: 這題挺水的…把到按順序填入方陣,一個數在填入的時候,在當前行中已填入的數字的數目,就是當前行比它大的數字的數目,因此很自然地得到排名,列也是同理,就這樣記錄一下即可回答每個詢問,時間複雜度。
T2 染色
題目大意: 用種顏色填入有個小格的紙條,求對於任意連續個格子裡,必然存在兩個格子顏色相同的填色方案數。
我的思路: 這題我是最後做的,在考場上想了兩個小時…然而還是涼了…
賽後同校AFO大佬說:“這題挺簡單的啊…”並一下就說出了怎麼轉移,仔細一想還真的很有道理…
令為前個格子中填色,其中從後往前最長一段不包含相同顏色格子的字尾長度為的方案數。那麼在轉移時,如果不選擇最後個格子中的顏色,那麼最長字尾長度就變成,有種顏色可供轉移。如果選擇最後個格子中的顏色,那麼最長字尾長度就會變成,各有種顏色轉移。於是得到狀態轉移方程:
轉移的時候用字尾和優化一下就可以達到的複雜度了。而此時,要計算最長字尾長度達到過的方案數比較麻煩,不如補集轉化一下,反過來求最長字尾長度不曾達到過的方案數更加簡單,只需要不考慮的影響即可,最後用減去這個方案數就是答案了。
T3 遊戲
題目大意: 一個遊戲有個角色排成一個序列,有個等級(),有個引數,滿足角色經驗值