1. 程式人生 > 實用技巧 >雜題20210103

雜題20210103

CF712E Memory and Casinos

\(n\) 個位置,處於第 \(i\) 個位置時,有 \(p_i=\frac{x_i}{y_i}\) 的概率會走到 \(i+1\) ,有 \(1-p_i\) 的概率會走到 \(i-1\) ,現在有 \(q\) 次操作,分為兩種:

  1. 1 i x y\(p_i\) 改為 \(\frac{x}{y}\)
  2. 2 l r 初始在位置 \(l\) ,不斷隨機遊走,走到 \(r+1\) 時停止,問行走過程中沒有任意一時刻走到 \(l-1\) 的概率,絕對誤差 \(<10^{-4}\)
  • \(n,\ q\leq10^5\)
  • \(1\leq x\leq y\leq10^9\)
  • 保證任意時刻 \(p_i\) 不降

假設詢問區間為 \([1,\ n]\)

我們記 \(f_i\) 為,從位置 \(i\) 開始,走到 \(n+1\) 時停止,沒有任意一時刻走到 \(0\) 的概率

那麼有 \(f_0=0,\ f_{n+1}=1,\ f_i=p_if_{i+1}+(1-p_i)f_{i-1}\ (1\leq i\leq n)\) ,答案為 \(f_{1}\)

\(f_i-f_{i-1}=p_i(f_{i+1}-f_{i-1})\)

我們記 \(g_i=f_{i}-f_{i-1}\) ,則有 \(g_i=p_i(g_{i+1}+g_{i})\) ,即 \(g_i=\displaystyle\frac{p_i}{1-p_i}g_{i+1}\)

注意到 \(f_{n+1}=\displaystyle\sum_{i=1}^{n+1}g_i=1\) ,並且 \(g_i=g_{n+1}\displaystyle\prod_{j=i}^n\frac{p_j}{1-p_j}\) ,我們可以求出 \(x=1+\displaystyle\sum_{i=1}^n\prod_{j=1}^n\frac{p_j}{1-p_j}\) , 那麼 \(g_{n+1}=\frac1x\) ,則有 \(f_1=g_1=g_{n+1}\displaystyle\prod_{i=1}^n\frac{p_i}{1-p_i}\)

區間的 \(x\)\(\displaystyle\prod_{i=1}^n\frac{p_i}{1-p_i}\)

可以用線段樹求出,但這樣會炸精度

實際上我們也可以考慮 \(g_{i+1}=\displaystyle\frac{1-p_i}{p_i}g_i\)

則有 \(f_{n+1}=\displaystyle\sum_{i=1}^{n+1}g_i=g_1(1+\sum_{i=1}^{n+1}\prod_{j=1}^i\frac{1-p_j}{p_j})=1\)

我們只需求出 \(x=\displaystyle 1+\sum_{i=1}^{n+1}\prod_{j=1}^i\frac{1-p_j}{p_j}\) ,答案即為 \(\frac1x\) ,而線上段樹維護過程中,如果 \(x\) 的值大於 \(10^4\) ,我們可以直接將其看作 \(\inf\) ,可以避免炸精度


CF493E Vasya and Polynomial

給定 \(t,\ a,\ b\) ,問有多少個非負係數的多項式滿足 \(f(t)=a,\ f(a)=b\)

\(1\leq t,\ a,\ b\leq10^{18}\)

注意到如果 \(f(x)\) 有多於一個係數不是 \(0\) ,那麼一定有所有係數均小於 \(a\) ,那麼此時 \(f(x)\) 可由 \(b\)\(a\) 進位制下的表示唯一確定

\(f(x)\) 僅有最高項不是 \(0\) ,特判掉 \(t=a=1\) 的情況,那麼 \(f(x)\) 的次數不會超過 \(60\) ,暴力列舉即可


CF494D Birthday

給定一棵 \(n\) 個點的帶正邊權樹, \(q\) 次詢問,每次給定 \(u,\ v\) ,問

\[\displaystyle\sum_{x\in subtree(v)}dis(u,\ x)^2-\sum_{x\notin subtree(v)}dis(u,\ x)^2 \]

\(n,\ q\leq10^5\) ,答案 \(\bmod10^9+7\)

做法一:

首先可以換根 dp 對所有 \(u\) 求出 \(dp_u=\displaystyle\sum_{x=1}^ndis(x,\ u)^2\)

那麼答案即為 \(2\displaystyle\sum_{x\in subtree(v)}dis(u,\ x)^2-dp_u\)

如果 \(u\notin subtree(v)\) 是很好做的,直接將距離拆成 \(dis(u,\ x)=dis(u,\ v)+dis(v,\ x)\) 即可

否則我們列舉鏈 \((u,\ v)\) 上的一點 \(y\) ,統計 \(lca(u,\ x)=y\) 時的答案

大力劃一波式子再套上一個線性 \(lca\) 即可做到 \(O(n)\) ,但並不好寫

做法二:

將詢問離線,把詢問 \((u_i,\ v_i)\) 掛在點 \(u_i\) 上,從根往下 dfs

對於當前 dfs 到的 \(u\) ,我們維護 \(a_i=dis(i,\ u)^2,\ b_i=dis(i,\ u)\)

不難發現,當我們從 \(u\) 轉移到其某個兒子 \(v\) 時,這個可以直接用線段樹維護

這棵線段樹需要支援:

  1. 區間加
  2. 詢問區間平方和

時間複雜度 \(O(n\log n)\) ,比上一種做法不知道好寫到哪裡去了


CF314D Sereja and Straight Lines

給定平面上 \(n\) 個點 \((x_i,\ y_i)\)

選擇一個點 \((x,\ y)\) ,如果存在兩條穿過 \((x,\ y)\) 的直線,且與 \(x\) 軸正方向夾角分別為 \(45^{\circ},\ 135^{\circ}\) ,定義 \((x_i,\ y_i)\)\((x,\ y)\) 的權值為 \((x_i,\ y_i)\) 到兩條直線的曼哈頓距離的最小值,定義點 \((x,\ y)\) 的權值為對於所有 \((x_i,\ y_i),\ 1\leq i\leq n\)\((x_i,\ y_i)\)\((x,\ y)\) 的權值的最大值

問在所有可能的選擇 \((x,\ y)\) 的方案中,權值最小是多少

  • \(n\leq10^5\)
  • \(|x_i|,\ |y_i|\leq10^9\)

先將座標軸順時針轉 \(45^{\circ}\) ,然後考慮二分答案 \(\leq mid\)

做法一:

對於 \((x_i,\ y_i)\) ,合法的 \((x,\ y)\) 的取值範圍是一個以 \((x_i,\ y_i)\) 為中心的十字形,且它的邊長是 \(2mid\)

現在的問題是對於 \(1\leq i\leq n\)\((x_i,\ y_i)\) 所形成的十字架是否有交,使用可以得到一個 \(O(n\log^2 n)\)優秀做法

做法二:

對於 \((x,\ y)\) ,需要滿足 \(\forall\ 1\leq i\leq n,\ (x_i,\ y_i)\) 坐落於以 \((x_i,\ y_i)\) 為中心、邊長為 \(2mid\) 的十字架

那麼列舉 \(1\leq i\leq n\) ,找到 \(j\) 滿足 \(x_j\) 最小且 \(x_i-x_j\ge2mid\) ,這部分將所有點按 \(x_i\) 排序後可以使用掃描線

我們將位置 \(x_i\) 看作該十字架的平行於 \(y\) 軸部分的矩形的右端點的橫座標,接下來只需要判斷對於所有 \(x_k>x_i\)\(x_k<x_j\) ,它們的縱座標的極差是否 \(\leq2mid\)

時間複雜度 \(O(n\log n)\)


CF587E Duff as a Queen

給定一個長為 \(n\) 的序列 \(a_1,\ a_2,\ \cdots,\ a_n\) ,有 \(q\) 次操作,操作分為兩種:

  1. 1 l r k ,將區間 \([l,\ r]\) 中的 \(a_i\) 異或上 \(k\)
  2. 2 l r ,詢問這個區間所有子集的異或和形成的集合的大小(空集合法,異或和為 \(0\)
  • \(n\leq2\times10^5\)
  • \(q\leq4\times10^4\)
  • \(0\leq a_i\leq 10^9\)

\(b_i\)\(a_i\) 的異或差分序列,即 \(b_i=a_i\oplus a_{i-1}\)

我們選一個區間 \([1,\ n]\) 的子集 \(S=\{p_1,\ p_2,\ \cdots,\ p_k\}\) ,則 \(\begin{aligned}&a_{p_1}\oplus a_{p_2}\oplus\cdots\oplus a_{p_k}\\&=b_{p_1+1}\oplus b_{p_1+2}\oplus\cdots\oplus b_{p_2}\oplus a_{p_3}\oplus a_{p_4}\oplus\cdots\oplus a_{p_k}\\&=b_{p_1+1}\oplus b_{p_1+2}\oplus\cdots\oplus b_{p_2}\oplus b_{p_3+1}\oplus b_{p_3+2}\oplus\cdots\oplus b_{p_4}\oplus a_{p_5}\oplus a_{p_6}\oplus\cdots\oplus a_{p_k}\\&\cdots\end{aligned}\)

我們總可以將 \(a_{p_1}\oplus a_{p_2}\oplus\cdots\oplus a_{p_k}\) 對應到一個 \(B\) 的子集 \(T\) 上,反之亦然

那麼對於詢問 \([l,\ r]\) ,我們考慮集合 \(\{a_l,\ b_{l+1},\ b_{l+2},\ \cdots,\ b_r\}\) 的所有子集的異或和,和原問題等價

可以用線段樹維護一個區間的 \(b_i\) 構成的線性基, pushup 時暴力 \(O(\log^2a_i)\) 合併兩個線性基即可

對於修改 \([l,\ r],\ k\) ,對序列 \(b\) 造成的影響是, \(b_l\leftarrow b_l\oplus k,\ b_{r+1}\leftarrow b_{r+1}\oplus k\) ,再用一個樹狀陣列維護 \(a_i\) 的單點取值即可

時間複雜度 \(O(n\log^3n)\)


CF283E Cow Tennis Tournament

  • \(n\) 頭牛, \(k\) 次操作。
  • 每頭牛有個能力值 \(s_i\) 。對於兩頭牛,令能力值大的那個向能力值小的那個連一條有向邊。
  • \(i\) 次操作中, \(\rm Farmer\ John\) 會選擇一段區間 \([a_i,\ b_i]\) ,並且對於 \(\forall x,\ y \in [1,\ n] \land s_x,\ s_y \in[a_i,\ b_i]\) ,將 \(x\)\(y\) 間的連邊反向。
  • 請你求出,進行 \(k\) 次操作之後,圖中有多少三元環。
  • \(3 \leq n \leq 10^5\)\(0 \leq k \leq 10^5\)\(1 \leq s_i \leq 10^9\)\(1 \leq a_i < b_i \leq 10^9\) 。保證 \(s_i\) 互不相同,不保證 \(a_i\) 或者 \(b_i\) 與某個 \(s_j\) 相同。

考慮如何統計競賽圖三元環個數

容斥,我們列舉一個 \(1\leq u\leq n\) ,三元組 \((u,\ v,\ w)\) 不能形成三元環,當且僅當 \(u\) 連出去的兩條均為出邊 / 入邊,這樣每對不合法三元環只會在點 \(u\) 處被統計一次

那麼答案等於 \(\displaystyle\binom n3-\sum_{i=1}^n\binom{d_i}2\) ,其中 \(d_i\) 是點 \(i\) 的出度 或 入度

考慮原題,我們要對每個點求其出度,考慮原圖鄰接矩陣,初始時 \(G_{i,\ j}=[j<i]\) ;而離散化後,操作 \(i\) 會導致左上角為 \([a_i',\ a_i']\) ,右下角為 \([b_i',\ b_i']\) 的矩形中的 \(0/1\) 取反

掃描線一下即可


CF30E Tricky and Clever Password

給定字串 \(S\) 。求一個長度為奇數的迴文串 \(T\) 以及一個不超過 \(n=|T|\) 的正整數 \(x\) ,使得存在至少一組字串 \((S_2,\ S_2,\ S_3)\)\(S_1,\ S_2,\ S_3\) 可以為空)滿足 \(S = S_1 + T [1,\ x] + S_2 + T [x + 1,\ n − x] + S_3 + T [n − x + 1,\ n]\)\(T [l,\ r]\) 表示 \(T\) 的第 \(l\) 到第 \(r\) 字元組成的子串,從 \(1\) 編號。 求滿足條件的長度最大的 \(T\) 的長度是多長。

\(n\leq10^5\)

由於 \(T[n-x+1,\ n]\) 必定是 \(S\) 的一段字尾,考慮列舉 \(x\)

我們想讓 \(T[1,\ x]\)\(T[n-x+1,\ n]\) 的反串在 \(S\) 中的最靠前出的現位置,這樣就能給 \(T[x+1,\ n-x]\) 留出”儘量多的空間“

我們考慮讓 \(S\) 的反串 \(S^R\)\(S\) 匹配,對於每個位置 \(i\) 我們求出一個最大的 \(m_i\) 使得 \(S[i-m_i+1,\ i]\)\(S^R[1,\ m_i]\) 相等,可以用 kmp 求出,那麼最小的 \(m_x=id\) 就是 \(T[1,\ x]\) 最靠前的出現位置就是 \([id-x+1,\ id]\)

那麼現在的問題是,找到 \(S[id+1,\ n-x]\) 中最長的長為奇數的迴文串,這個就是 \(T[x+1,\ n-x]\)

用 manacher 求出以 \(i\) 為中心的最長迴文串長度 \(ext_i\)

考慮二分答案 \(mid\) ,只需要判斷區間 \([id+1+\frac{mid-1}2,\ n-x-\frac{mid-1}2]\) 是否存在 \(ext_i\ge mid\) 即可

時間複雜度 \(O(n\log n)\)


CF455E Function

有一個遞推式 \(f(i,\ j)=\min(f(i-1,\ j-1),\ f(i-1,\ j))+a_j\) ,其中 \(2\leq i\leq j\leq n\)

給定 \(f(1,\ k)\)\(1\leq k\leq n\)\(q\) 次詢問 \(f(x_i,\ y_i)\)

\(n,\ q\leq10^5\)

\(s_i=\displaystyle\sum_{k=1}^if(1,\ k)\)

首先需要注意到一個結論,假設 \(f(x,\ y)\) 最終從 \(f(1,\ k)\) 轉移得到( \(y-x+1\leq k\leq y\) ),那麼轉移路徑一定形如 \(f(1,\ k)\to f(2,\ k)\to f(3,\ k)\to\cdots,\ f(t,\ k)\to f(t+1,\ k+1)\to f(t+2,\ k+2)\to\cdots\to f(x,\ y)\)

如果將 \(f(i,\ j)\) 放在一個 \(n\times n\) 網格的第 \(i\) 行第 \(j\) 列,轉移就形如:先向下轉移一段,接著不斷向右下轉移

可以反證,應該也挺能感性理解的

那麼 \(f(1,\ k)\)\(f(x,\ y)\) 的貢獻路徑是唯一的,得到的值為 \(s_y-s_k+(x-y+k)\cdot f(1,\ k)\) ,注意到這對於 \(k\) 而言是一個以 \(x-y\) 為自變數的一次函式,那麼我們的問題就變成了求編號在一段區間中區間的直線在橫座標為 \(x-y\) 時縱座標的最小值

可以用線段樹維護凸包,時間複雜度 \(O(n\log^2n)\)


CF213E Two Permutations

給定一個 \(n\) 的排列 \(P\) 和一個 \(m\) 的排列 \(Q\)

問有多少個 \(x\) 滿足,序列 \(P_1+x,\ P_2+x,\ \cdots,\ P_n+x\)\(Q\) 的子序列

\(n\leq m\leq 2\times10^5\)

注意到序列 \(\{P_i+x\}\) 始終滿足極差為 \(n-1\) ,考慮從這裡入手

我們升序列舉 \(x\) ,考慮排列 \(Q\) 中,僅保留值域在 \([x+1,\ x+n]\) 的元素,得到的序列

只要其差分陣列等於排列 \(P\) 的差分陣列,該 \(x\) 就合法

\(x\) 轉移到 \(x+1\) 時,我們會刪掉 \(Q\) 中元素 \(x+1\) ,新增元素 \(n+x+1\)

可以用資料結構維護如上操作後得到的序列的差分序列的 hash 值

時間複雜度 \(O(n\log n)\)


CF1067D Computer Game

\(n\) 個遊戲,第 \(i\) 個遊戲有收益 \(a_i\) 升級後有收益 \(b_i\) 。每秒可以選一個遊戲玩,第 \(i\) 個遊戲有 \(p_i\) 的概率成功,如果成功則獲得當前收益,並可以選擇任意一個遊戲進行升級。求 \(t\) 秒後期望收益的最大值

  • \(n\leq10^5\)
  • \(t\leq10^{10}\)
  • \(1\leq a_i<b_i\leq10^8\)

不難發現,如果我們成功了至少一場遊戲,那麼之後我們一定會持續遊玩 \(t=b_i\times p_i\) 最大的遊戲,但這並不意味著最優的遊戲過程中,我們最多隻會玩兩種不同的遊戲

\(f_i\) 為還剩 \(i\) 分鐘的答案,那麼有 \(f_i=\displaystyle\max_{1\leq j\leq n}\{(1-p_j)f_{i-1}+p_j(i-1)t+a_jp_j\}\)

那麼對於一個 \(k\ (p_k<p_j)\)\(f_i\)\(j\) 轉移得到比由 \(k\) 轉移得到劣,當且僅當

\[\begin{aligned}(1-p_j)f_{i-1}+p_j(i-1)t+a_jp_j&<(1-p_k)f_{i-1}+p_k(i-1)t+a_kp_k\\\displaystyle\frac{a_jp_j-a_kp_k}{p_j-p_k}&<f_{i-1}-(i-1)t\end{aligned} \]

可以發現 \(g_i=f_i-it\) 是單減的

確定決策點後 \(f_i\) 可以用矩乘快速轉移

我們不妨二分在什麼時間轉移的決策點會改變

如果直接二分,時間複雜度是 \(O(n\log^2t)\)

但可以預處理矩陣的 \(2^k\) 冪,然後可以倍增做到 \(O(n\log t)\)


CF1458C Latin Square

給定一個 \(n\times n\) 的矩陣,其每行每列都是一個 \(n\) 的排列,有 \(m\) 次操作,有以下幾種型別:

  • UDLR 將矩陣每行 / 每列 往某個方向迴圈移動一格
  • IC 將矩陣每一行 / 列上的排列變為其逆排列

求最後的矩陣

\(n\leq1000;\ m\leq10^5\)

我們將矩陣元素 \(a_{i,\ j}\) 看作三元組 \((i,\ j,\ a_{i,\ j})\)

那麼 UDLR 對三元組 \((x,\ y,\ z)\) 的影響為:

  • U \((x,\ y,\ z)\leftarrow(x+1,\ y,\ z)\)
  • D \((x,\ y,\ z)\leftarrow(x-1,\ y,\ z)\)
  • L \((x,\ y,\ z)\leftarrow(x,\ y+1,\ z)\)
  • R \((x,\ y,\ z)\leftarrow(x,\ y-1,\ z)\)

操作 IC 對其影響為:

  • I \((x,\ y,\ z)\leftarrow(x,\ z,\ y)\)
  • C \((x,\ y,\ z)\leftarrow(z,\ y,\ x)\)

我們求出這 \(m\) 個操作造成的影響即可推得操作後的矩陣


記得將主席樹空間稍微開大一點