Solution Set - 神奇 NOIP 模擬賽


\[\mathfrak{\text{Defining }\LaTeX\text{ macros...}}\newcommand{\vct}[1]{\boldsymbol{#1}}\newcommand{\stir}[2]{\genfrac{\{}{\}}{0pt}{}{#1}{#2}}\newcommand{\opn}[1]{\operatorname{#1}}\newcommand{\lcm}[0]{\opn{lcm}}\newcommand{\sg}[0]{\opn{sg}}\newcommand{\dist}[0]{\opn{dist}}\newcommand{\lca}[0]{\opn{lca}}\newcommand{\floor}[2]{\left\lfloor\frac{#1}{#2}\right\rfloor}\newcommand{\ceil}[2]{\left\lceil\frac{#1}{#2}\right\rceil} \]

  2021.10.29.

  「A. 莓良心」 給定 \(\{w_n\}\),對於所有將其划分為 \(k\) 個非空集合的方式,求 \(w_i\times (w_i\text{ 所在集合大小})\) 之和的總和模 \(998244353\) 的值。\(n\le10^6\)

  考慮算每個 \(w_i\) 的貢獻次數,首先 \(w_i\) 自己算一次,\(\stir{n}{k}\);任意 \(j\not=i\)\(w_j\)\(w_i\) 放一次時貢獻一次,\((n-1)\stir{n}{k-1}\)\(\mathcal O(n)\) 算第二類斯特林數單點值即可。


  「B. 盡梨了」 給定 \(\{(a,b)_n\}\),初始時 \(t=0\),每次選一個未選過的 \(i\),令 \(t\leftarrow(a_i+1)(t+1)+b_i\),需要保證此時 \(t\le m\)。求最多能選擇的次數。\(n\le2\times10^5\)\(m\le10^9\)

  交換貪心可知確定要選的集合時最優的選取順序,依此排序后,問題變為從其中依次取子序列。注意到 \(a=0\) 的必然最后選,且按 \(b\) 從小到大選;\(a\not=0\) 每次選擇至少有 \(t\leftarrow 2(t+1)\),對於這種情況直接 DP,最后考慮 \(a=0\) 即可。復雜度 \(\mathcal O(n\log m)\)


  「C. 團不過」 有求 \(n\) 堆有標號石子堆,每堆石子數量在 \([1,2^n)\) 且不存在兩堆相同數量石子堆時,Nim 先手必勝的方案數。\(n\le10^7\)

  令 \(f_i\) 為僅考慮 \(i\) 堆石子的方案數,顯然可以通過下降冪、\(f_{i-1}\)\(f_{i-2}\) 進行轉移。復雜度 \(\mathcal O(n)\)


  「D. 七負我」 給定無向圖 \(G\),給每個結點賦非負實數權值 \(a_i\),使得 \(\sum a_i=x\),最大化 \(\sum_{(u,v)\in E}a_ua_v\)\(n\le40\)

  調整法證必然有一種方案,\(a_i>0\) 的結點的導出子圖是團,團內部的最優決策顯然是平均分點權(可以不等式或者口算一下拉格朗日乘子法),繼而發現取最大團最優。這里直接 Meet in Middle 求最大團即可。復雜度 \(\mathcal O(2^{\frac{n}{2}}n)\)




  2021.10.30.

  「A. 特殊字符串」 水。


  「B. 寶可夢」 給定一個 \(n\times m\),有牆或空地的迷宮,保證空地在四聯通意義下構成樹。接下來 \(q\) 組詢問,每次給定起點,第一步方向(保證不撞牆)和終點,求從起點摸着右手的牆走,需要走多少步到終點。\(nm\le5\times10^5\)\(q\le10^5\)

  分析清楚題意后,直接拆四個點建圖。注意到可能作為起點,或者可能是中間過程的點必然是兩兩可達的,所以圖是一整個環,在環上隨便寫寫就行。

  Attention. 圖在具體題目的具體性質分析清楚再動手,直接搓一個基環樹森林的做法太浪費時間了。


  「C. 矩陣」 給定 \(n\times m\) 的矩陣 \(A\),找一條四聯通意義下的路徑,使得依次經過的元素構成等比序列,或聲明存在長度無窮大的路徑。\(nm,a_{i,j}\le4\times10^4\)

  先判掉無窮大,之后枚舉第一步然后記憶化搜索可以做到 \(\mathcal O(nm\log^2 a)\),或者 DP 一下可以做到 \(\mathcal O(nm)\)


  「D. 乘法」 求十六進制下 \(n!\) 除去末尾 \(0\) 后的最后 \(16\) 位。\(n<2^{64}\),多測 \(T\le10\)

  先求出 \(n!\) 含因子 \(2\) 的個數,接下來要求出

\[\sum_{i}f\left(\floor{n}{2^i}\right), \]

其中 \(f(n)=(n-[2\mid n])!!\),問題轉化為求雙階乘。令 \(F_n(x)=\prod_{i<2n,2\nmid i}(2x+i)\),那么 \(F_n(0)=(2n-1)!!\),且 \(F_{2n}(x)=F_n(x)F_n(x+n)\),注意到當次數 \(k>63\)\([x^k]F_n(x)=0\),所以可以暴力卷積。在二進制掃描 \(n\) 的同時倍增,可以做到 \(\mathcal O(T\log^3n)\)




  2021.11.01. 總之就是四道傻瓜題。

  「A. 集合均值」 水。


  「B. 聚烷撐乙二醇」 水。但出題人不寫浮點比較 SPJ 還卡精度。


  「C. 技術情報局」 給定 \(\{a_n\}\),求 \(\sum_{[l,r]}\left(\max_{i=l}^r\{a_i\}\right)\left(\prod_{i=l}^ra_i\right)\),序列隨機,模給定數 \(M\)\(n\le10^7\)

  單調棧 \(\mathcal O(n)\) 嘛,我告訴你能做就肯定能做的啦~


  「D. 肯德基」 求 \(\sum_{i=1}^n\mu^2(i)i\)\(n\le10^{14}\),數據組數 \(T\le100\)

  容斥,答案顯然是

\[\sum_{i=1}^{{\sqrt{n}}}\mu(i)S(n/i^2)i^2, \]

其中 \(S(n)=\frac{n(n+1)}{2}\)。發現可以用 \(i^2\)\(n\) 進行整除分塊。復雜度方面,當 \(i\le n^{\frac{1}{3}}\),僅有 \(\mathcal O(n^{\frac{1}{3}})\) 個取值;當 \(i>n^{\frac{1}{3}}\),有 \(\frac{n}{i^2}\le n^{\frac{1}{3}}\),也僅有 \(\mathcal O(n^{\frac{1}{3}})\) 個取值,所以分塊復雜度為 \(\mathcal O(n^{\frac{1}{3}})\)。總復雜度即 \(\mathcal O(\sqrt n+Tn^{\frac{1}{3}})\)




  2021.11.02.

  「A. 按位或」 求序列 \(\{x_n\}\) 的個數,滿足 \(3\mid x_i\)\(\bigvee_{i=1}^nx_i=t\)。答案模 \(998244353\)\(n,t\le10^{18}\)

  不太簽到的題。聯想十進制下 \(\bmod~3\) 的結論,發現 \(3\mid x_i\) 等價於從最低位起,相鄰兩個 bit 為一組,各組數值之和是 \(3\) 的倍數。容斥沒有滿足或起來為 \(t\) 的 bit 組計數即可。


  「B. 最短路徑」 給定一棵含有 \(n\) 個點的樹,以及其中一個大小為 \(m\) 的關鍵點集 \(S\)。對於 \(S\)\(|T|=k\) 的子集 \(T\),求依任意次序遍歷過 \(T\) 中所有結點的最短路徑長度的期望。答案模 \(998244353\)\(n\le2\times10^3\)\(m\le300\)

  遍歷 \(T\) 的最短路徑長度顯然是 \(T\) 的虛樹所含邊數 \(\times2\) 減去 \(T\) 的樹上直徑,分別計數。對於邊數,枚舉邊,求這條邊兩側都有關鍵點的方案數;對於直徑,令 \(d(u,v)\) 表示 \(u,v\) 的樹上距離,對於路徑 \(D(u,v)\) 定義一個嚴格偏序關系:

\[D(u,v)<D(x,y)\Leftrightarrow d(u,v)<d(x,y)\lor (d_(u,v)=d(x,y)\land (u,v)>(x,y)). \]

其中 \((u,v)>(x,y)\) 指一般的二元組偏序關系,當然也可以替換成方便區分的其他式子。在此基礎上,可以證明對於 \(D(u,v)\),若不存在 \(w\) 能夠使 \(D(u,w)>D(u,v)\land D(v,w)>D(u,v)\) 變大,則 \(D(u,v)\) 是直徑。枚舉直徑 \(D(u,v)\),求出無法更新直徑的點集 \(\{w\}\),剩下的 \(k-2\) 個關鍵點都取自 \(\{w\}\),組合算貢獻。

  為什么我忽略了邊數和直徑可以拆開算啊……


  「C. 仙人掌」 給定一株仙人掌,求其鄰接矩陣的行列式。\(n\le 10^5\)

  等價於邊匹配,得到的排列中,二階輪換的貢獻是 \(-1\),其余 \(k\) 階輪換的貢獻是 \(2\times(-1)^{k-1}\)。圓方樹 DP 即可。


  「D. 對弈」 Cover「SDOI 2011」黑白棋。我不會,但是




  2021.11.03 @ LOCAL/20211103/

  「A. 鮮血之女王」 水,不過賽時無腦 DP 壓根沒證正確性(雖然過了。


  「B. 撤離」 求排列 \(\{p_n\}\) 冒泡排序恰好進行 \(k\) 次 swap 后得到的排列。\(n\le10^6\)

  我真的做過這道題嗎? 我會求進過完整 \(t\) 輪后的交換次數,也會求到經過完整 \(t\) 輪后得到的排列,而一輪最多 swap \(\mathcal O(n)\) 次,所以在這個排列的基礎上再模擬一輪冒泡即可。


  「C. 閃蝶」 水,線段樹維護 GF 板題(但是選手不得試圖使用生成函數。


  「D. 緣分的天空」 給定一棵含 \(n\) 個結點的樹,對於 \(k=0,1,\dots,n-1\),求隨機切樹上 \(k\) 條邊得到的森林中,每棵樹所含結點數量的平方之和的期望值。答案模 \((10^9+7)\)\(n\le10^5\)

\[\begin{aligned} E_k(|T|^2) &= E\left[\left(\sum_u [u\in T]\right)^2\right]\\ &= E\left(\sum_u [u\in T]^2\right)+2E\left(\sum_{u\not=v}[u\in T][v\in T] \right)\\ \end{aligned}\\ \begin{aligned} \Longrightarrow E_k\left(\sum_i |T_i|^2\right) &= n+2\sum_{u\not=v}[\operatorname{path}(u,v)\in G_k]\\ &= n+\frac{2}{(n-1)^{\underline{k}}}\sum_{l=1}^{n-1}c_l(n-1-l)^{\underline{k}}. \end{aligned} \]

其中 \(c_l\) 表示原樹上長度為 \(l\) 的路徑條數。若能求出 \(\{c\}\),可以發現這個式子是差卷積:

\[E_k\left(\sum_i |T_i|^2\right)=n+\frac{2}{(n-1)^{\underline{k}}}\sum_{l=0}^kc_l(n-1-l)!\cdot\frac{1}{(n-1-l-k)!}. \]

  好吧其實難點是實現,求 \(\{c\}\) 可以 DSU 或者點分,但得寫多項式卷積。注意路徑條數不超過 \(n^2\),所以可以寫模 long long 的 NTT。但是最后這個卷積是真的沒辦法——只能寫 MTT。總之吧我一份代碼寫了 MTT + NTT,常數大概是標算的 \(0.2\) 倍叭。但是有 9K 的碼量




  2021.11.04.

  「A. 謎之階乘」 水。


  「B. 子集」 將 \(1\sim n\) 划分為 \(k\) 組,每組大小相等且數字和相等。多測,\(\sum n\le10^6\)

  每組大小是偶數顯然;若是奇數,嘗試先用一些數組把每組大小填充成偶數。觀察樣例並打表發現可用 \(1\sim 3k\) 填每組前 \(3\) 個,具體構造方法多種多樣(我懶得描述了√


  「C. 混凝土粉末」\(\{a_n\}\) 初始全為 \(0\)\(q\) 次操作,區間加,詢問某個 \(a_i\) 最早什么時候 \(\ge h\)\(n,q\le10^6\)

  對不起兩個 log 無腦整體二分能操過。 離線下來,在序列上做掃描線,在時間軸上維護 BIT 或線段樹,樹上二分求答案,即可做到單 \(\log\)


  「D. 排水系統」 挺可愛的題 w。我的題解




  2021.11.05.

  「A. 回文」 給定字符矩陣 \(\{S_{n\times m}\}\),求從 \((1,1)\) 出發走到 \((n,m)\) 且只向下或向右走的所有路徑中,依次經過的字符形成回文字符串的路徑數量。\(n,m\le500\)

  明顯只能從起點和終點同時 DP。\(f(i,j,k)\) 表示起點終點各走 \(i\) 步,起點走到第 \(j\) 行,終點走到第 \(k\) 行,當前行走路徑字符串對稱的方案數。討論一下轉移,滾掉第一維狀態就行了。


  「B. 快速排序」 水。


  「C. 混亂邪惡」 給定 \(A\subseteq\{1,2,\dots,m\}\)\(|A|=n\in(\lfloor\frac{2m}{3}\rfloor,m]\)。求 \(S\cup T=A,S\cap T=\varnothing\),且 \(\sum_{a\in S}a=\sum_{b\in T}b\)\(m\le10^6\)

  要看出這是道構造題而非亂搞題就很難啊喂。 如果 \(n\) 是奇數,令 \(A\leftarrow A\cup\{0\}\)。將 \(A\) 的元素升序排列后,令 \(d_i=a_{2i}-a_{2i-1}\),我們嘗試用 \(\{d_{n/2}\}\) 來構造等和。(為什么想到兩兩捆綁?這就是傳說中構造題的 movitation?)

  觀察 \(\{d_{n/2}\}\) 的性質:\(\sum_id_i\le m-\frac{n}{2}<n\)(利用題設性質,太 tm 妙啦),即至少有一個 \(d_i=1\)。接着歸納構造:

  • \(\forall d_i=1\),由於 \(2\mid\sum_id_i\),必然有解;

  • 否則,將 \(\{d\}\) 中最大值和最小值(必為 \(1\))取出,將它們的差值返還。

  這個方法顯然是很厲害的。


  「C. 校門外歪脖樹上的鴿子」 給定一棵維護序列長度為 \(n\),隨便划分區間的線段樹,支持 \(m\) 次區間加或查詢區間和操作。但是標記不下傳。\(n,m\le2\times10^5\)

  左右加哨兵,變成類似 ZKW 線段樹的形式,修改查詢都類似於走一條路徑,修改/統計某側兒子的貢獻,所以你永遠可以相信 毛毛蟲剖分




  2021.11.06.

  「A. 破門而入」 水,但有個傻子拿 EGF 推出式子准備開始寫暴力卷積的時候發現這是第一類 Stiring 數。


  「B. 翻轉游戲」 從讀完題到證完結論不到 30s.jpg。


  「C. 奶油蛋糕塔」 總不能看不出是歐拉路吧,但有個傻子狀壓連通性+狀壓度數奇偶性大力 DP WA 了。😅


  「D. 多重影分身之術」 建議換道題放 T4。

  我敲?這就是今天的題解嗎?!




  2021.11.07. 總之就很辣雞。




  2021.11.08. 今天是 Yet another NOI Professional Simulation。(

  「A. NOIP 2018」 水。


  「B. CSP 2019」 給定 \(n\) 階矩陣 \(A\) 和列向量 \(b\)\(T\) 次詢問,每次詢問給出 \(k\),求 \(\bmod 2\) 意義下的 \(A^kb\)\(n,\sum \log_2k\le2\times10^3\)

  取 \(A\) 的特征多項式 \(p(x)=|xI-A|\),由 \(\sf Cayley–Hamilton\) 定理,\(p(A)=0\)。令

\[r(x)\equiv x^k\pmod{p(x)}, \]

那么 \(A^k=r(A)+kp(A)=r(A)\)。而 \(\deg r=\mathcal O(n)\),考慮答案形式為 \(\sum_i r_iA^ib\),可以預處理 \(A^ib\)快速求解。

  寫不來,全程口胡。


  「C. CSP 2020」 定義正整數 \(x\) 的拆分是數列 \(\{t_k\}\),滿足 \(t_i\in\{0,1,\dots,9\},\sum t=x\),此時將 \(t\) 依次寫下作為一個十進制數 \(v_x\)。現給出 \(m\),對於 \(n=1,2\dots,m\),求 \(n^3\) 的所有拆分得到的 \(v_{n^3}\) 去重並升序排序后的第 \(n^4\) 個數。答案模 \(p\)(不保證為素數)。\(m\le10^3\)

  注意到成為答案的 \(v_x\) 應有 \(\log_{10}v_x\approx\frac{x}{9}\)。因為在 \(\overline{a99\dots9}\) 中選若干個 \(9\) 減去 \(1\),令 \(a\) 加上減去的總和,這一方案數的規模遠大於 \(n^4\)

  回到題目,這種題慣用手法是確定位數,再從高到低枚舉,用方案數判斷當前位的取值。預處理約 \(n^{1.5}\) 范圍內的方案數,對於超過該范圍的方案,組合數的快速增長讓我們可以快速判斷與需求方案數的大小關系。最后,只特判后導 \(9\) 的起始位置即可。總復雜度為 \(\mathcal O(m^{2.5})\)


  「D. NOIP 2021」 對於素數 \(p=4324321=2^5\times3^3\times5\times7\times11\times13+1\),取其原根構成的序列 \(\{g_0,g_1,\cdots,g_{m-1}\}\) 作為密鑰,對於明文串 \(S\),定義加密 \(s_i\mapsto g_{i\bmod m}^{s_i}\bmod p\)。現給出 \(m\) 和密文 \(S'~(|S'|=n)\),解出明文 \(S\)\(m\le10^5\)\(40m\le n\le 50m\le5\times10^6\)。保證明文是有意義的英文段落,\(s_i\) 是大小寫字母以及 \(\{\text{' '},\text{'.'},\text{','},\text{'?'},\text{'!'},\text{'-'},\text{'"'},\text{'''},\text{':'},\text{'('},\text{')'},\text{';'}\}\) 中的一個。

  任取一個 \(p\) 的原根 \(r\),令 \(g_i=r^{\alpha_i}\),顯然 \(\alpha_i\perp\varphi(p)\)。那么 \(s'=g_i^s\Rightarrow \operatorname{Ind}_r s'=\alpha_is\)\(\operatorname{Ind}_r s'\) 是可求的,我們枚舉 \(s\),解同余方程就能夠得到若干可能 \(\alpha_i\),用 \(\alpha_i\) 嘗試解密一些 \(s\) 即能判斷合法性,考慮到對於錯誤的密鑰,解出字符在字符集內的概率極小,視為 \(\mathcal O(1)\)。現在就幾乎能完成解密了,不過很卡常。

  聯系 \(S\) 是英文文段以及生活實際,猜測一些字符在至少 \(40\) 個位置中必然出現,關鍵問題是找到方便后續計算的字符。注意到 \(\alpha_i\perp\varphi(p)\),即 \(\gcd(\operatorname{Ind}_rs',\varphi(p))\) 完全來自 \(s\)。注意到 \(s\in\{\text{i},\text{h},\text{n},\text{l},\text{u},\text{p},\text{c}\}\) 時恰整除 \(\varphi(p)\);當 \(s=\text{' '}\) 時,\(s\) 的倍數全為非法字符。所以直接考查 \(\operatorname{Ind}_rs'\) 對於它們的整除性即可。

  看什么看,我寫 T 了。




  2021.11.10.

  「A. 開掛」 水。


  「B. 叄仟柒佰萬」 水。


  「C. 超級加倍」 給定一棵樹含 \(n\) 個結點的樹,求路徑 \((u,v)\) 的數量,使得 \(u\not=v\),且 \(u\) 是路徑經過結點中標號最小的,\(v\) 是路徑經過結點中標號最大的。\(n\le2\times10^6\)

  我是不是傻 qwq。 點分治?我想我優化不動二維偏序。而注意到樹上最大最小,應該聯想到笛卡爾樹。建出大根笛卡爾樹和小根笛卡爾樹,那么 \((u,v)\) 合法當且僅當在大根樹上 \(v\)\(u\) 的祖先,在小根樹上 \(u\)\(v\) 的祖先。在一棵樹上 DFS,BIT 維護另一棵樹上的 DFN 即可。復雜度 \(\mathcal O(n\log n)\)


  「D. 歡樂豆」 給定含 \(n\) 個結點的有向完全圖,邊 \(\lang u,v\rang\) 的權為 \(w\lang u,v\rang=a_u\),現修改 \(m\) 條邊的點權,求兩兩最短路之和。\(n\le10^5\)\(m\le2\times10^3\)

  顯然由修改的邊構成的圖中,不同的連通塊相對獨立。在一個連通塊中,可以線段樹優化 Dijkstra 暴力做最短路。所以可以做到 \(\mathcal O(m^2\log m)\)。有一些並不太困難的小細節叭。




  2021.11.11.

  「A. 嗑瓜子」 水。


  「B. 第 k 大查詢」 給定排列 \(\{a_n\}\),求所有長度大於 \(k\) 的區間的第 \(k\) 大值之和。\(n\le5\times10^5\)\(k\le50\)

  從 \(n\)\(1\) 枚舉第 \(k\) 大值 \(x\),一個區間的第 \(k\) 大為 \(x\) 當且僅當其中包含恰好 \(k\) 個大於等於 \(x\) 的數。維護已經枚舉過的值,發現可能作為合法區間端點的只有 \(\mathcal O(k)\) 段,暴力計算答案即可。

  神 tm std::set::iterator 的自加是最壞 \(\mathcal O(\log n)\) 的,只有掃描整個 set 是均攤 \(\mathcal O(1)\) 的(相當於遍歷一棵樹),T 飛了。


  「C. 樹上路徑」 給定一棵含有 \(n\) 個結點的樹,設 \(l_1,l_2\) 是兩條點不交路徑的長度(經過結點個數),求可能的 \((l_1,l_2)\) 的數量。\(n\le5\times10^5\)

  路徑點不交,那么存在一條邊,使得割掉這條邊后兩條路徑分別處於兩棵子樹,換根求出兩棵子樹的直徑后轉化成矩陣並(其實就是后綴最大值)。(換根有點細節別寫錯了 qwq。


  「D. 糖」 數軸上依次有 \((n+1)\) 個關鍵點,第 \(0\) 個點為原點,第 \(i\) 個關鍵點的坐標是 \(a_i\)。你從 \(0\) 出發,每走一單位吃掉一顆糖,每到達一個關鍵點,可以以 \(b_i\) 的單價買糖,以 \(s_i\) 的單價買糖,但最多攜帶 \(C\) 顆糖。求到達 \(n\) 號關鍵點時的最小花費(假設你初始的錢足夠多)。\(n\le2\times10^5\),保證有解且答案有限。

  做這種買賣問題的一貫套路是:憑空買,憑空賣,等價操作賺大錢。我們直接從等價操作的角度研究:

  • 買入再以相同價格退掉 \(\Leftrightarrow\) 不買,所以每到一個關鍵點可以補滿背包。

  • 買入,篡改價格,退掉 \(\Leftrightarrow\) 低買高賣,所以我們只需要處理“買”和“退”兩種操作。

  實現上,走到 \(i\) 時,維護當前背包內剩余的糖果集合 \(S\),並保持價格單調性。將背包內所有價格 \(<s_i\) 的糖果價格篡改為 \(s_i\)(賣);將背包內所有價格 \(>b_i\) 的糖果價格改為 \(b_i\)(重新買),並用當前 \(b_i\) 補滿背包;最后吃掉下一步需要的糖果(挑便宜的吃咯)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM