往年 NOI 題目選做

一個新坑,先把真題都刷一下大概就知道會考什麼和難度怎麼樣了。

2013

向量內積

給定一個 \(n\)\(m\) 維向量,求出一組不同的向量 \(p,q\) 使其內積(點乘)在模 \(k\) 意義下爲 \(0\)

\(k=2,1\le n\le 2\times 10^4, 1\le m\le 100\)\(k=3,1\le n\le 10^5, 1\le m\le 30.\)

*哈希,矩陣,模

神奇套路題。主要思想:隨機化哈希判斷相等。原理:哈希值相同是真的相同的必要條件。

把向量想象成一個 \(n\times m\) 的矩陣 \(A\),題目等價於 \(AA^T\) 在非對角線上存在 \(0\) 值。先考慮 \(k=2\) 的情況,只需判斷是不是全是 \(1\) 即可。直接做是 \(n^2m\) 的,考慮再乘上一個 \(n\times 1\) 的列向量,可以優化到 \(O(nm)\)。這時只需判斷最後的結果是否相同,隨幾次可以認爲是對的。

\(k=3\) 時我們發現 \(1^2\equiv 2^2\equiv 3\pmod 3\)。於是我們把答案的矩陣每個數平方,對應到原來的矩陣即把向量 \(a_1,a_2,...,a_m\to a_1a_1,a_1a_2,...a_1a_m,a_2a_1,a_2a_2,...,a_2a_m,...a_ma_1,a_ma_2,...a_ma_m\)。所以可以 \(O(nm^2)\)

code

矩陣遊戲

*數列,費馬小定理

先把單獨一行拿出來看,設 \(f_1\) 是這一行的第一個元素,有 \(f_i=f_{i-1}*a+b\)。所以 \(f_m=f_1a^{m-1}+\frac{a^{i-1}-1}{a-1}b\)。如果不會的可以再去補一下高中數學。

然後設 \(g_i\) 是第 \(i\) 行的 \(f_m\),有 \(g_i=(g_{i-1}c+d)a^{m-1}+\frac{a^{i-1}-1}{a-1}b\),然後換個元又變成上面的式子,搞一搞就出來了。

但是 \(n,m\) 太大怎麼搞?我們有一個費馬小定理,\(a^{p-1}=1\pmod p,a<p\)。然後就可以降到 \(p\) 以下了。

坑點:注意 \(a=1\) 時等比數列求和公式不存在,需要特判,而次時又需要模 \(p\)\(n,m\),所以 \(n,m\) 兩個都要模。

樹的計數

*概率期望,樹的遍歷

首先我們發現我們要求的就是樹的期望高度,然後根據期望的線性性我們可以把它分成幾層。

觀察到這個樹的編號是無所謂的,我們可以給bfs序重新編號成 \(1\)\(n\),同時改變dfs序,這樣不會有影響。

又發現bfs是按層來搞的,所以我們下一步就是分層,也就是把bfs劃分成幾個區間,每個區間在一層。

顯然這不可能是隨便分層,有一些限制。我們用一個數組來表示 \(i\)\(i+1\) 直接有沒有分割,如果爲 \(0\) 即爲不確定。

1,\(1\)\(2\) 之間一定有分隔。這很顯然。

2,假設 \(d_i\)\(i\) 在dfs序中的位置。若 \(d_i>d_{i+1}\) 說明dfs的過程中先遍歷到 \(i+1\) 再遍歷到 \(i\),而如果他們在同一層中則不可能(因爲是按順序排的),所以它們一定不在同一層中,答案加一。

3,還有這第三個限制,也是比較難想到的。假設 \(dfn_i\) 是dfs序,若 \(dfn_i+1<dfn_{i+1}\),說明 \(dfn_{i+1}\) 的 深度最多比 \(dfn{i}\) 多1,所以 \(dfn_{i}\)\(dfn_{i+1}\) 之間最多放一個分隔線,而枚舉幾種情況發現期間必有一條分隔線,所以這一段不得再有其他分隔線。

最後,如果還是可填可不填的答案就加0.5。

快餐店

*基環樹,dp

這是一道類似於基環樹直徑的題。顯然答案爲直徑除以2。

考慮暴力的做法,每次斷一條環上邊,然後找一下當前的直徑,再取一個最小值即可。

優化也很簡答,維護四個數組 \(h1,h2,g1,g2\) 分別代表到左端點(環上第一個點)前綴最大值,到右端點(也是環上第一個點(嘿嘿想不到吧,只不過饒了一圈))後綴最大值,以及前綴最大答案和後綴最大答案,不動的看一下圖就懂了。

NOI2013.png

然後我們枚舉斷邊\(i \rightarrow i+1\),然後拿\(max(h1[i]+h2[i+1],max(g1[i],g2[i+1]))\)來更新答案,別忘了再和不在環上的鏈取最大。

書法家

*dp

從右往左,\(11\) 個 dp。注意細節就好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章