1. 程式人生 > >退役前的做題計劃2.0

退役前的做題計劃2.0

最小割 插入 省選 http 直接 順序 ali 質數 ...

最近在刷省選題......大致上是按照省份刷的。
不過上面的題目順序是按照寫題的順序排列的,所以可能會有點亂哈。

[BZOJ2823][AHOI2012]信號塔

最小圓覆蓋,隨機增量法,期望復雜度\(O(n)\)

[Luogu4899][IOI2018] werewolf 狼人

\(\mbox{Kruskal}\)重構樹+二維數點。

[Luogu4900]食堂

\(\sum_{i=1}^n\sum_{j=1}^i\frac ij-\sum_{i=1}^n\sum_{j=1}^i\lfloor\frac ij\rfloor\)
前半部分隨便弄弄就好了。
後半部分,\(\sum_{j=1}^i\lfloor\frac ij\rfloor\)

實質上等於\(\sum_{j=1}^id(j)\)
所以前綴和一下就好了。

[Luogu4902]乘積

\(\frac{\prod_{i=1}^ni^{\sum_{j=1}^i\lfloor\frac ij\rfloor}}{\prod_{i=1}^n\prod_{j=1}^ij^{\lfloor\frac ij\rfloor}}\)
上半部分就是\(\sum_{i=1}^ni^{\sum_{j=1}^id(j)}\)
下半部分,\(\prod_{j=1}^ij^{\lfloor\frac ij\rfloor}\)實質上是\(i\)的各約數的乘積,也就是\(i^{\frac{d(i)}2}\)


所以前綴積一下就好了。

[BZOJ2178]圓的面積並

辛普森積分,雖然是假的。

[BZOJ4913][SDOI2017]遺忘的集合

多項式求\(\ln+\mbox{MTT}\)。誰說莫比烏斯反演的來著?

[BZOJ4911][SDOI2017]切樹遊戲

丟貓錕題解就跑

[LuoguT46780]ZJL的妹子序列

很顯然是要求\(\prod_{i=1}^n\frac{1-x^i}{1-x}\)\(x^m\)次項系數。
一種做法是求\(\ln\)之後大力開式子,然後可以\(O(n\ln n)\)調和級數求得一多項式然後再\(\exp\)回去。
還有一種做法是拆成前後兩部分,\((\frac1{1-x})^n=(\sum_{i=0}^{\infty}x^i)^n\)

,相當於\(n\)個盒子每個盒子可以無限放球的生成函數,所以\(x^m\)次項系數是\(\binom{n+m-1}{m}\)\(\prod_{i=1}^n(1-x^i)\)可以看做一個帶符號的\(01\)背包計數,其中第\(i\)個物品的重量恰好為\(i\)。考慮到至多選\(O(\sqrt m)\)個物品,所以可以做\(O(n\sqrt m)\)\(dp\)

[Luogu4921]情侶?給我燒了!

\(f_{i,j}\)表示前\(i\)對情侶已經入座,有\(j\)對情侶是挨著的的方案數。考慮插入第\(i+1\)對情侶。
\(f_{i,j}\)可以轉移到\(f_{i+1,j-2},f_{i+1,j-1},f_{i+1,j},f_{i+1,j+1}\),分別表示第\(i+1\)對情侶分別拆散了兩對情侶、只拆散了一對情侶、沒有拆散情侶以及他倆坐在一起。註意兩人分開座時可能會導致某對情侶復合,轉移的時候要額外算一下貢獻。

[BZOJ3307]雨天的尾巴

線段樹合並模板題。樹上差分的時候,對\(lca\)\(fa_{lca}\)打標記而不是做線段樹單點插入,即可把空間減小到一半。

[BZOJ1227][SDOI2009]虔誠的墓主人

坐標離散,橫坐標從左往右掃,維護每個縱坐標已存在的點數,組合數算一下,再用樹狀數組區間求和即可。

[BZOJ4870][SHOI2017]組合數問題

矩陣快速冪模板題。

[BZOJ3434][WC2014]時空穿梭

枚舉\(n\)維中每一維坐標的極差\(\Delta x_i\),有
\[\sum_{\Delta x_1=1}^{m_1}\sum_{\Delta x_2=1}^{m_2}...\sum_{\Delta x_n=1}^{m_n}\binom{\gcd(\Delta x_1,\Delta x_2...\Delta x_n)-1}{c-2}\prod_{i=1}^n(m_i-\Delta x_i)\]
枚舉\(\gcd(\Delta x_1,\Delta x_2...\Delta x_n)\),有
\[\sum_{d=1}^{\min(m)}\binom{d-1}{c-2}\sum_{\Delta x_1=1}^{m_1/d}\sum_{\Delta x_2=1}^{m_2/d}...\sum_{\Delta x_n=1}^{m_n/d}[\gcd(\Delta x_1,\Delta x_2...\Delta x_n)=1]\prod_{i=1}^n(m_i-\Delta x_id)\]
反個演
\[\sum_{d=1}^{\min(m)}\binom{d-1}{c-2}\sum_{t=1}^{\min(m)/d}\mu(t)\sum_{\Delta x_1=1}^{m_1/dt}\sum_{\Delta x_2=1}^{m_2/dt}...\sum_{\Delta x_n=1}^{m_n/dt}\prod_{i=1}^n(m_i-\Delta x_idt)\]
換個寫法
\[\sum_{d=1}^{\min(m)}\binom{d-1}{c-2}\sum_{t=1}^{\min(m)/d}\mu(t)\prod_{i=1}^n\sum_{\Delta x_i=1}^{m_i/dt}(m_i-\Delta x_idt)\]
\(T=dt\),改變枚舉順序
\[\sum_{T=1}^{\min(m)}(\prod_{i=1}^n\sum_{\Delta x_i=1}^{m_i/T}(m_i-\Delta x_iT))\sum_{d|T}\binom{d-1}{c-2}\mu(\frac Td)\]
\(F(T)=\prod_{i=1}^n\sum_{\Delta x_i=1}^{m_i/T}(m_i-\Delta x_iT)\)\(G(T)=\sum_{d|T}\binom{d-1}{c-2}\mu(\frac Td)\)
首先\(G(T)\)在給定\(c\)的前提下可以\(O(n\ln n)\)預處理出來。
觀察\(F(T)\),將其劃開
\[F(T)=\prod_{i=1}^nm_i\lfloor\frac{m_i}T\rfloor-\frac{T\lfloor\frac{m_i}T\rfloor(\lfloor\frac{m_i}T\rfloor+1)}2\]
如果\(\lfloor\frac{m_i}T\rfloor\)確定的話,那麽\(F(T)\)就是一個關於\(T\)\(n+1\)次多項式。所以可以預處理\(G(T)T^i\)的前綴和,然後對於每個\(\lfloor\frac{m_i}T\rfloor\)相同的連續段暴力求\(F(T)\)
總體復雜度\(O(n\ln nc+nmc+Tn^3\sqrt m)\)有點爆炸啊。

[BZOJ3629][JLOI2014]聰明的燕姿

直接爆搜質因子,特判最後一個大於根號的質因子即可。

[BZOJ5157][TJOI2014]上升子序列

對於前面的相同元素,直接強制從最後一個這種元素轉移即可。

[BZOJ3628][JLOI2014]天天酷跑

先枚舉跳躍高度和連跳次數,然後直接記搜轉移即可。

[BZOJ3505][CQOI2014]數三角形

正難則反,求三點共線的方案數。枚舉相隔較遠的兩點的橫縱坐標之差,然後第三個點就有\(\gcd-1\)種選法。註意特殊處理橫縱坐標差為\(0\)

[BZOJ4001][TJOI2015]概率論

\(f_n\)表示\(n\)點二叉樹的數量,\(g_n\)表示\(f_n\)棵二叉樹的總葉子節點個數。
最近做初賽題發現\(f_n\)就是卡特蘭數。
\(g_n\)是啥?考慮\(f_n\)中的一棵\(n\)點二叉樹,設其有\(m\)個葉子,那麽刪掉這\(m\)個葉子後就能得到\(m\)棵不同的\(n-1\)點二叉樹;而每棵\(n-1\)點二叉樹有\(n\)個位置可以掛葉子,也就是說在上述過程中被計算了\(n\)次。所以\(g_n=nf_{n-1}\)
\(ans=\frac{g_n}{f_n}=\frac{nf_{n-1}}{f_n}=\frac{n(n+1)}{4n-2}\)

[BZOJ3999][TJOI2015]旅遊

樹剖+線段樹兩只\(\log\),用\(\mbox{LCT}\)寫可以做到一個\(\log\)
每個點維護區間最大值,最小值,後面最大值減前面最小值的最大值,前面最大值減後面最小值的最大值。

[BZOJ4000][TJOI2015]棋盤

其實棋子是放在中間那一行的。
所以直接按行\(dp\)就行了。處理一下相鄰兩行的兩個狀態是否可以轉移,因為轉移都是一樣的所以可以矩乘優化,復雜度\(O(2^{3m}\log n)\)

[BZOJ5156][TJOI2014]拼圖

據說這玩意兒叫精確覆蓋?直接狀壓完事了。

[BZOJ5158][TJOI2014]Alice and Bob

因為保證\(a\)可以由一個排列得到,所以\(x\)就一定會是排列,否則不更優。貪心,盡量把數值大的放在前面,把數值小的放在後面。對於\(a_i\)值相差為\(1\)的點對建立拓撲關系,然後依次填數,最後統計一遍答案就行了。

[BZOJ5155][TJOI2014]電源插排

正解是動態開點線段樹,但是感覺比較難寫,就換了一種寫法。
開個\(\mbox{std::set}\)維護未放置的區間,平衡樹維護已放置的位置集合,支持插入刪除,找前驅後繼,統計區間點數即可。(如果叠代器支持相減的話就可以直接開兩個\(\mbox{std::set}\)做了)

[BZOJ3173][TJOI2013]最長上升子序列

其實只要能夠得到最終生成的序列就很好辦了。考慮從大到小確定每個數在最終序列裏的位置,相當於查找當前的第\(k\)大元素。\(BIT\)可做。

[BZOJ3174][TJOI2013]拯救小矮人

對於所有要出去的小矮人,一定是按照\(a+b\)權值從小到大出去最優。
排序,然後設\(f_i\)表示出去了\(i\)個小矮人時人梯的最高高度。如果\(f_j+b_i\ge h\)就可以用\(f_j-a_i\)更新\(f_{j+1}\)

[BZOJ3175][TJOI2013]攻擊裝置

黑白染色然後跑最小割。

[BZOJ3167][HEOI2013]Sao

一條鏈是考過的原題。
如果是樹的話同樣可以設\(f_{u,i}\)表示\(u\)點子樹內,\(u\)點排在第\(i\)個的方案數,每次轉移就是合並兩個序列,枚舉\(f_{u,i}\)以及在\(u\)的前面放\(j\)個元素,根據大小限制決定是從\(f_{v,1...j}\)轉移過來還是從\(f_{v,j+1...sz_v}\)轉移過來,同樣可以用前綴和優化轉移,同時要乘上前後隔板插入的方案數\(\binom{i+j-1}{j}\times\binom{sz_u-i+sz_v-j}{sz_v-j}\),復雜度\(O(n^2)\)

[BZOJ4824][CQOI2017]老C的鍵盤

上一題弱化版。雙倍經驗。

[BZOJ5019][SNOI2017]遺失的答案

論一個辣雞出題人是如何被吊打的

[BZOJ3163][HEOI2013]Eden的新背包問題

預處理多重背包的前後綴\(dp\),每組詢問\(O(m)\)回答。

[BZOJ3164][HEOI2013]Eden的博弈問題

\(f_u\)表示\(u\)點子樹內最少要選多少個葉子才能必勝,如果\(u\)點是自己控制的那麽\(f_u=\min\{f_v\}\),否則\(f_u=\sum f_v\)。找出所有可能是最優轉移點的葉子即可。

[BZOJ2742][HEOI2012]Akai的數學作業

找到最高和最低的非零系數\(a_m,a_n\),因為答案是有理數所以一定是\(\frac pq\)的形式,更具體的\(p\)一定是\(a_m\)的約數\(q\)一定是\(a_n\)的約數。所以暴力枚舉一下然後\(\mbox{check}\)\(\mbox{check}\)的話,\(x\)是浮點數不好做,可以選幾個大質數做模意義下的運算判斷結果是不是\(0\)即可。

退役前的做題計劃2.0