清華集訓 2017 小 Y 和恐怖的奴隸主

2022-05-20 05:00:48 字數 1257 閱讀 7959

是不是這題太水了都沒人寫啊

本題官方題解提供的做法實際上複雜度非常高

很顯然本題的\(\text\)是儲存每種血量的隨從數量

設狀態數量的上限是\(s\)

當\(m=3,k=8\)時,這樣的狀態一共有\(s=165+1\)種

如果直接\(dp\),每次轉移是\(o(1)\)的,可以做到\(o(n\cdot s)\),顯然無法處理\(n\)較大的情況

用矩陣優化\(\text\)轉移,樸素的實現可以做到\(o(t\cdot \log n\cdot s^3)\)

如果預處理出轉移矩陣的冪次,每次查詢時只有列向量與方陣的乘法,所以複雜度是\(o(\log n\cdot s^3+t\log n\cdot s^2)\)

官方題解提供的做法就是在在這個演算法上進行常數優化,這wtm

\[\

\]對於已知\(m,k\)來說,設每個\(n\)構成的答案數列為\(a_n\)

預先處理一部分的答案\(a_1\cdots a_n\),使用\(\text\)演算法求出序列的最**性遞推

發現總是在\(o(s)\)的長度以後,遞推序列不再改變,即總能得到乙個長度為\(o(s)\)的全域性線性遞推

即總可以在\(o(s^2)\)的時間內求出答案序列\(a_n\)的線性遞推式

那麼對於求得的線性遞推式,問題轉化為對於每個查詢的\(n\),求常係數線性遞推數列的第\(n\)項答案

特徵多項式的做法,可以做到單組查詢\(o(s\log n\log s)\)的之間求出

那麼總複雜度就是\(o(s^2+t\cdot s \log s\log n)\)

理論上來說,這個複雜度無論是不是漸進意義下都比矩陣快

但是實際實踐中,由於多項式運算的大常數,不優秀的實現下甚至可能超時

考慮到本題多查詢的性質,我改變了倍增的基數\(d\),並且預處理出倍增用到的\(x^i\mod \lambda\)

預處理部分的複雜度是\(o(\log_d^n \cdot (d-1)\cdot s\log s)\)

查詢部分的複雜度是\(o(\log _d^n s\log s)\)

由於我的多項式模板不夠成熟

在loj上,經過這樣的魔改,已經能跑得比矩陣塊

但是在uoj上,我同樣的**竟然慢了四倍,而這份**在uoj上的執行時間還略有提高

表示很是絕望。。

事實上,這種做法在\(m,k\)較大時同樣可行,在\(s\)較大,\(t\)較小的情況下,實際執行總能有更好的表現

清華集訓 小 Y 和恐怖的奴隸主

傳送門 觀察到 m 的值很小,考慮把不同血量的隨從的個數計入狀態。設 dp 表示在第 i 次攻擊之後,還剩 a 個一血怪,b 個二血怪,c 個三血怪的概率。轉移很顯然,只需要注意生成新怪的情況即可。但是這對於 n le 10 來說是完全不行的。我們考慮矩陣加速。首先我們對每乙個合法的三元組 a,b,...

清華集訓2017模擬 ces

首先把用tajan把橋邊全部找出來,橋邊會把圖分成若干個雙聯通分量。把每個雙聯通分量並成乙個點,橋邊作為邊,這會構成一棵樹。顯然,對於每個詢問加k條邊最多能去掉多少條橋邊,就是用k條簡單路徑去覆蓋這棵樹,最多能覆蓋多少條邊。有乙個很優的貪心,把k按1 q做,每次找到樹的直徑,答案加上直徑的長度,把直...

清華集訓2017滾粗記

很早就到了,然後就被眾人教育,晚上連營ak殺被wzd yql教育,去找wyy換衣服又被wyy和dwj教育。虛心接受教育之後就回去了。考得最崩的一天。開場看完題發現t1是個原題加強,t2只會狀壓的部分分,t3是個裸分塊但是要寫挺久的,於是決定先開t1。開了t1半個小時之後發現毫無思路,式子並不能像原題...