Last dance

OptimisticForever發表於2024-10-26

Last dance

ARC183D Keep Perfectly Matched

我們考慮一條邊的貢獻到底是多少,那麼假設它連的兩個結點的子樹大小分別為 \(x,y\)。上界顯然為 \(\min (x,y)\)

大膽猜結論,一定能取到上界。

首先,我們定根,顯然重心比較優秀,然後考慮重心分為了 \(T_1,T_2,\cdots ,T_k\)\(k\) 個子樹,其中每個子樹的根我們記為 \(root(T_i)\)

假設根一開始與 \(root(T_i)\) 配對,那麼每次我們就可以找到一個 \(T_j\),滿足 \(i\not= j\),然後選擇 \(T_i,T_j\) 的兩個葉子刪去,這個時候根就和 \(root(T_j)\) 配對了。貪心的來講,每次我們肯定是選擇那個 \(|T_j|\) 最大的 \(j\)

我們現在考慮如何每次找到當前要刪的合法點。

我們考慮一個點如果和父親配對,那麼這個點的兒子可以任意順序刪;如果一個點與其中一個兒子配對,那麼這個點必定是選擇先刪這個兒子的點。

這樣子,我們求出這個樹的後序遍歷,滿足先走匹配邊。然後套用上述過程即可。

ARC183E Ascendant Descendant

我們求出每一個位置 \(i\) 可以移動到的區間 \(l_i,r_i\),表示 \(a_i\) 可以為 \(b_{j}(j\in [l_i,r_i])\) 的祖先。

思考一下,如果兩個區間交了會怎麼樣,我們驚奇的發現,這並不合法,畫個圖看一下就知道了。

所以,區間都是形如包含或者不相交的兩種情況。

那麼我們可以建成一棵樹。

但是我們發現 \(i\) 最終不一定能走到 \(l_i,r_i\),因為會存在一些限制。

我們考慮一個區間 \(L,R\),如果這個區間的所有 \(l_i,r_i\) 的並恰好是 \([L,R]\),那麼這個區間把外界隔開了,也就是,其它區間穿越不了 \([L,R]\)

我們容易說明這個限制是唯一的。

現在考慮如何求出最終 \(i\) 的區間 \([l_i',r_i']\),我們從小到大列舉每個區間 \([l_i,r_i]\)

我們使用 set 維護每一個區間限制還有多少個位置,如果遇到一個 \((i,l_i,r_i)\),我們就從 \(i\) 向左向右找到第一個 \(=0\) 或者碰到邊界的位置,中間的這些區間都是可以到達的,然後再把中間這些區間合併,這樣子感受一下很對。

注意到最終算的是有多少種不同的 \(a\) 序列,所以如果兩個位置的答案區間相同,那麼就會重複算,除一下階乘即可。

CF1270G Subset with Zero Sum

接下來是一道非常 nb 的題目,這道題目 tourist 和 Benq 都沒有場切。

首先我們先移項,即 \(1\leq a_i-i\leq n\)

我們思考等於 \(0\) 的本質是什麼呢。

仔細想一下,感覺可以建圖,於是,我們連邊 \((i,a_i-i)\),然後發現就做完了。

對於這個基環樹森林的一個環,選這些位置一定合法,這個易證。

關鍵是怎麼想得到的呢?首先建圖是應該可以思考的,然後我們考慮把 \(0\) 和環儘量聯絡在一起,這樣子應該好想一點。

gmoj 8251 氣泡排序

下文定義逆序對數表示前面的比它大的數的數量。

性質一:假設現在在處理第 \(x\) 個數,就是說此時 \(i+K-1=x\)。那麼,\([x-K+1,x-1]\) 這段區間的數一定是前 \(x-1\)\(a\) 中的前 \(K-1\) 大。

證明:

如果這個數是前 \(x-1\) 個的前 \(K-1\) 大,那麼它一定會存在於 \([j-K+1,j]\) 的第 \(2\) 位之後(\(j<x\))。

性質二:不考慮操作 \(1\) 號位置。假設某個數的逆序對數為 \(x\),那麼它實現一次操作會將 \(x-(K-1)\)

證明:

根據性質一,我們把比這個數大的,也就是前 \(K-1\) 大的,都移到了這個數的前面,所以一次操作的變化為就是 \(K-1\)

根據性質二,我們容易知道,一個數的位置會在操作一次之後減去 \(K-1\)

我們觀察到如果一個數到了 \(K\) 之前,那麼它可以在新的一輪裡面操作 \(1\) 號位置導致這個數合法。

那麼我們就會把那些相同輪數到達 \(\leq K\) 位置的數放在一起做,這樣就做完了。

gmoj 8253 一眼

超級無敵構造題。

假設 \(m=2n-2\)

我們考慮類似雜湊表的事情。

如果 \(i,i+n\) 只出現一個,那麼我們直接讓 \(a_i=i\) 或者 \(a_i=i+n\),具體構造如下。

  • 對於 \(i\leq n-3\),若 \(i,i+n\) 出現其中一個,就用上面的方法。
  • 否則,若兩個都出現,我們發生了雜湊衝突,那麼我們就把 \(i+n\) 的放在那些 \(i,i+n\) 都沒出現的位置。
  • 剩下的 \(i\) 我們只需要保證不衝突即可,直接迴圈移位。

我們現在只需要證明剩下的 \(i\) 的數量 \(\geq 2\)

證明:

  • 如果 \(i\leq n-3\)\(i,i+n\) 衝突數量 \(\geq 2\),則合法。
  • 否則,由於 \(m=2n-2\),多留了 \(2\) 個位置,所以 \(n-1,n-2\) 至少存在一個,因此也符合條件。

於是結束了,聽說是 姚期智的論文

gmoj 8252 珍珠

拆位,現在需要求出第 \(i\) 位為 \(0/1\) 的方案數,設其分別為 \(f_0,f_1\)

首先,考慮沒有 \(X,Y\) 怎麼做。

\(f_0+f_1\) 是顯然的,由於我們要求 \(f_1\),我們考慮求出 \(f_1-f_0\)

於是想辦法構建雙射。

考慮一個偶數位置 \(p\),我們設其最小的位置滿足該位為 \(1\)\(j\)

那麼我們將 \(A_{p-1}\oplus 2^{i-j}\),那麼顯然,新的這個序列的答案為原本的答案取反。因此這個是一個雙射!

由此,我們就說明了,偶數位置一定是 \(0\) 才有貢獻,剩下的隨便填即可。

現在考慮有 \(X,Y\)

如果 \(Y=0\),我們直接分成兩個序列做。

如果 \(Y\not = 0\),那麼假設 \(X\) 或者 \(n-X+1\) 是偶數,就寄了,此部分的 \(f_1-f_0=0\)

否則,保證 \(n,X\) 都是奇數。我們把偶數位置取出來,可以類似上面證明,偶數位置都必須取 \(0\)

坑:注意要把更高位的貢獻算上!

Baggage

逆天構造。

\(f(x)\) 表示 \(n=x\) 的時候的最小步數。

觀察樣例,容易發現 \(f(x)=x\)

yhx 先證明了一個結論:\(f(x)\geq x\)

具體來說,初始相鄰相同的數為 \(0\),最終為 \(2(n-1)\),每次至多使得這個東西增加 \(2\),所以 \(f(n)\ge n\)

然後我們給出構造。

\(n=3\) 的時候,構造如下圖。

接著我們考慮 \(n\geq 4\) 的情況。我們把原問題分成兩個步驟。

  • 提取 \(AB,BA\) 這樣的子段,然後重排。
  • 提取 \(AA,BB\) 這樣的子段,然後重排。

觀察上圖,這種構造的充要條件就是綠色的數量和黃色的數量相同。

我們嘗試給 \(n=4,5,6,7,8,9\) 找到構造方案。

Last dance Last dance

注意到,我們 \(\bmod 4\) 分類,很有性質。

每次相當於在兩邊加了一個 pattern。於是實現這個東西即可。

ARC163 D Sum of SCC

差一點想到了。

顯然競賽圖縮點之後是鏈,那麼鏈長的組合意義,就是把鏈分成兩個部分的方案數 \(-1\)

滿足兩個部分一部分全部邊連向二部分。

所以我們直接計數這樣的劃分有多少個,顯然可以設 \(f_{i,j,k}\) 表示前 \(i\) 個數有 \(j\) 個在左邊,\(u<v\)\(k\) 個。

最後處理一下 \(-1\) 即可,怎麼就想不到呢!

2024年全國中學生數學奧林匹克競賽 預賽 二試 T4

\(A,B\) 為正整數,\(S\) 是一些正整數構成的集合,具有以下性質:

性質 1:對於任意非負整數 \(k\),有 \(A^k\in S\)

性質 2:對於任意一個 \(n\in S\),若 \(d|n\),則 \(d\in S\)

性質 3:對於任意兩個數 \(m,n\in S\),若 \(\gcd(n,m)=1\),則 \(nm\in S\)

性質 4:對於任意一個 \(n\in S\),有 \(An+B\in S\)

試證:所有正整數 \(\gcd(x,B)=1\),滿足 \(x\in S\)


引理 1:若質數 \(p|A\),則 \(\forall{k\in \N } ,p^k\in S\)

引理 2:對於某個數 \(n\),若 \(n=\prod_{i=1}^{k}p_i^{c_i}\in S\),且 \(m=\prod _{i=1}^{k}p_i^{d_i}\),則 \(m\in S\)

這個根據 性質 3 就可以推得。

引理 3:對於所有正整數 \(k\),若 \(n\in S\),有 \(A^kn+B\in S\)

\(n=\prod_{i=1}^{k}{p_i^{d_i}}\times \prod _{i=1}^{k'}q_i^{e_i},A=\prod_{i=1}^{k} p_i^{c_i}\)

那麼記 \(n_1=\prod_{i=1}^{k'}q_i^{e_i},n_2=\frac{n}{n_1}\)

顯然 \(\gcd(n_1,n)=1\)

根據 引理 1 和 引理 2,我們可以證明 \(A^{k-1}n_2\in S\)

顯然 \(\gcd(A^{k-1}n_2,n_1)=1\),根據 性質 2,\(n_1\in S\)

那麼根據 性質 3,\(A^{k-1}n\in S\),所以根據 性質 4,\(A^{k}n+B\in S\)

引理 4:\(n\in S\),則 \(n+B\in S\)

\(n+B=\prod _{i=1}^{k}p_i^{f_i}\times \prod _{i=1}^{k''}o_i^{g_i}\)\(A=\prod _{i=1}^{k}p_i^{c_i}\)

那麼記 \(n_3=\prod_{i=1}^{k''}o_i^{g_i},n_4=\prod_{i=1}^{k}p_i^{f_i}\)

顯然 \(\gcd(n_3,n_4)=1,\gcd(n_3,A)=1\)

根據 引理 2,我們可以證明 \(n_4\in S\)

由於 \(\gcd(n_3,A)=1\),則根據尤拉定理\(A^{\varphi(n_3)}\equiv 1(\bmod n_3)\)

\(A^{\varphi (n_3)}n+B=(A^{\varphi(n_3)}-1)n+B+n\equiv 0(\bmod n_3)\)

根據 引理 3,\(A^{\varphi(n_3)}n+B\in S\),所以 \(n_3\in S\)

根據 性質 3,\(n+B=n_3\times n_4\in S\)

回到原問題。

根據 性質 1,容易得知 \(1\in S\)

則反覆利用 引理 4,能證明 \(1+xB\in S\),其中 \(x\in \N\)

\(\gcd(n,B)=1\)

根據裴蜀定理,容易知道存在 \(y\in \Z\),滿足 \(yn-xB=1\),因此,\(yn\in S\),那麼 \(n\in S\)


本題的主要思路,就是先考慮 \(\gcd(n,B)=1\) 可以構造什麼,可以想到裴蜀定理

然後目的就是要證明 引理 4,這個感受發現很對。但是證明 引理 4,感覺就有點非人類了,可能是我太菜了。

於是就做完了這道題。

[NOI2023] 桂花樹

打表可以發現,答案與樹的形態無關

條件一可以等價為:\(T\)\(T'\)\([1,n]\) 中的點構成的虛樹相同。

條件二可以等價為:對於任意 \(i\)\(T'\)\([1,i]\) 構成的虛樹,不包含 \(>i+k\) 的結點。

我們考慮增量加入點。

首先兩種情況,就是直接在一個結點下方加入一個葉子,另一種就是在一條邊中插入一個結點。

但是我們還會出現,這樣的情況

這樣的話,我們稱這個 \([i+1,i+k]\) 的點為空白點。

那麼空白點是待確定的,我們可以之後再確定這樣的點。

於是還有第四種情況,就是確定一個空白結點。

注意到,我們需要保證的,就是以後確定的這個空白點,在前 \(k\) 輪必須放了,否則就作廢了。

所以可以記錄二進位制狀態 \(S\),表示目前未被確定的空白點的集合。

那麼直接轉移即可,時間複雜度 \(O(Tm2^kk)\)

ARC180E LIS and Inversion

結論都弄出來了,差一點。

注意到如下兩個結論:

  • 我們最後一定是一個把值域 \([l,r]\) 翻轉,其它從大到小填的序列。
  • \(>r\) 的部分一定是原序列字首。

這兩個結論我透過打表看出來了,感覺也是挺對的。

根據以上兩個結論,我們容易說明,只有 LIS 是有貢獻的。

因此,列舉 \(i\) 表示 \(>r\) 的數的個數,那麼顯然,\(b_{j}=i\)\(j\) 為 LIS 的部分。

所以我們儘可能使得後面的 \(a_j\leq i\),都給 LIS 部分,LIS 的剩下部分,就全部貢獻為 \(1\)

這樣子直接貢獻到答案就行了,我們發現是一個分段函式,可以資料結構維護,做到 \(O(n\log n)\),應該可以精細實現做到 \(O(n)\)

還有一種 dp 做法,待補。

ARC175E Three View Drawing

我們注意到,一個三元組 \((x,y,z)\),其出現了 \((x,y),(y,z),(z,x)\) 三種,所以應當與 \((z,x,y),(y,z,x)\) 放在一起。

那麼這三個三元組的共有性質就是 \(x+y+z\equiv 0(\bmod 3)\),而且是充要條件,所以就可以直接構造了。

具體的,我們發現若 \(n\bmod 3=0\),只有 \((0,0,0),(\frac n 3,\frac n 3,\frac n 3),(\frac {2n} 3,\frac {2n}3,\frac {2n}3)\) 三種情況比較特殊,剩下的都是上面的三元組。

否則,只有 \((0,0,0)\) 比較特殊。

那麼我們考慮把 \(m\),先拆分成若干個三元三元組,然後拼上一些沒有出現過的 \((x,x,x)\)

這是容易的,直接暴力列舉,打標記即可,我們可以證明一定存在至少 \(m\bmod 3\)\((x,x,x)\) 時空閒的。

ARC169E Avoid Boring Matches

這道題很神。

首先合法解的判斷是顯然的。

現在我們判斷一個串能否是合法的(不移位)。

我們注意到,一次匹配一定是將某個 B 與最近的 R 匹配,這個結論容易說明。

首先,我們知道若 B 佔據了前 \(2^{n-1}\) 個位置,這個序列一定合法。

於是可以猜測,我們定義一個比較函式 \(f\),一定存在一個分界線,使得,所有小於等於這個串的答案為 \(0\),而最終目標就是把原串變成這個分界線的串。

我們稱其為最劣合法解。

首先有一個顯然的觀察,若一個串合法,若存在位置 \(i,j\),滿足 \(S_i\)R\(S_j\)B,那麼交換 \(i,j\) 這兩個位置得到 \(S'\)\(S'\) 也合法。

於是,對於同一個相對位置的 \(S_i\)\(T_j\) 都為 B,我們看 \(i,j\) 的大小關係定義此時的 \(f\),同一個相對位置指的是前面 B 的出現次數。注意:\(f\) 是基於同一個相對位置而言的,而不是整個串。

所以,我們只需要對於 \(n\) 構造出來一個 \(2^n\) 的最劣合法解即可。

我們注意到,它是最劣的,當且僅當 B 的位置要儘可能右。

\(T_i\) 表示長度為 \(2^i\) 的最劣合法解,顯然 \(T_1\)RB

那麼對於 \(T_i\) 如果 \(T_{i-1}\) 當前為 B,就在 \(T_i\) 後面加上 BR,否則加上 R。剩餘部分都使用 B 填充即可。

那麼直接計算答案,就是對於同一個相對位置 B 計算 \(\max(i-j,0)\) 的和,因為如果 \(i<j\) 則這個位置比最劣解更優,不需要換。

考慮為什麼存在 \(i>j\) 則一定是不合法的。

原因是:考慮歸納證明,然後我們取出第一個滿足 \(i>j\) 的位置,那麼經過一輪貪心匹配操作就會不合法,具有歸納性。

gmoj 8245 送分題

假設固定 \((i,k)\),那麼合法的 \(j\) 一定是一段區間。

\(f\) 表示這段區間每種數出現最晚位置的最小值,\(g\) 表示每種數出現最早位置的最大值。

那麼貢獻為 \(\max(f-g,0)\)

\(f_i,g_i\) 表示固定 \(k\)\(i\) 這個點動,\([i,k]\) 的上面資訊。

當插入 \(i+1\) 號結點時,設 \(a_{i+1}\) 這個數上一次出現在 \(lst\) 位置,那麼 \([lst+1,i+1]\) 這個區間的 \(g\) 都變成 \(i+1\)

\(f\) 的話,我們發現 \(f_j=lst\) 的這些 \(j\) 都要變大,於是維護一個單調棧,每次把 \(f_j=lst\) 的變成比 \(lst\) 大的那個值。

用線段樹維護 \(f\) 的和 \(g\) 的和,兩個陣列都是單調的,所以可以直接線段樹二分維護貢獻和。

gmoj 8164 劃分隊伍

先把二元環判掉。

我們拆貢獻,考慮 \(i\) 什麼時候與 \(a_i\) 匹配,每個點都算一遍,總和就是要求的東西。

我們觀察一下,若 \(i\)\(j=a_i\) 匹配了,有什麼條件。

一個比較基礎的觀察就是,設 \(c_i\) 表示 \(i\) 這個點的出現時間,那麼 \(c_j<c_i\),且 \(a_k=j,k\not =i\) 的點 \(k\) (稱之為 \(j\) 的兒子點)要滿足 $c_{k}\not \in[c_j,c_i] $。

但是,這是必要條件,但不充分。

所以,我們需要減掉 \(j\) 這個點和 \(a_j\) 匹配的方案,這個也是同理,我們算不出來,所以繼續讓 \(j\to a_j\),這樣的話,最終形成一個 \(\rho\)。就可以類似容斥的計算了。

現在的問題是,最終的排列要保證若干個點不在某個區間內,我們繼續容斥。

\(f_{i,j}\) 表示考慮前 \(i\) 個位置,目前欽定了 \(j\) 個點在所對應的區間,剩下的亂填的方案。

那麼列舉 \(k\) 表示 \(i+1\) 這個位置的點的兒子中選了多少個欽定,然後貢獻就是 \(({sz-1})^{\underline k}\)\(sz\) 表示兒子個數,可以轉移到 \(f_{i+1,j+k}\)

最後我們剩下的那些直接亂填即可,容斥係數顯然為 \((-1)^j\)

注意一下,最後一個點需要特判,要把前面的某個 \(sz\) 再減去一去 dp。

容易發現這個 dp 是 \(O(n^2)\),第二維的總和是 \(O(n)\)

所以總時間複雜度為 \(O(n^3)\)

gmoj 8247 經典題

第一步轉化很妙!

首先特判 \(k_1=k_2\),然後欽定 \(k_1<k_2\)

我們考慮對於每一個 \(p\) 單獨考慮,這個顯然是正確的。

對於某個 \(p\),設 \(a=p^i,b=p^j\)

那麼貢獻就是 \(p^{ik_1+jk_2}\)

我們固定,\(ik_1+jk_2=h\),我們肯定要 \(i+j\) 儘量小。

\(\delta_1=\frac{k_1}{\gcd(k_1,k_2)},\delta _2=\frac{k_2}{\gcd(k_1,k_2)}\),那麼 \(i-\delta_2,j+\delta_1\) 肯定答案不變,\(i+j\) 變小。我們要使得 \(i,j\) 是非負整數,顯然,\(i-\delta_2< 0\),因此 \(i<\delta _2\)。設 \(k=\delta_2\)

意思是,\(p^i\) 不能含有 \(p^{k}\) 這個因數,積性起來,意思就是,\(a\) 這個數不能含有任何大於 \(1\) 的數的 \(k\) 次方作為因數。

我們列舉一個數 \(i\),欽定 \(a\) 含有 \(i^k\) 這個數的因數。容斥係數顯然為 \(\mu (i)\)

那麼目標就轉化成了 \(\sum _{xy\leq N}x^{k_1}y^{k_2}\)

注意到 \(x,y\) 必定有一個 \(\leq \sqrt N\),所以列舉那個容斥一下,剩下的就是自然數冪和,觀察到一定是 \(\lfloor\frac{n}{x}\rfloor\) 的形式的自然數冪和,預處理即可,這部分可以做到 \(O(\sqrt N)\)

所以現在複雜度大概就是 \(\sum _{i=1}^{^k\sqrt{n}}\sqrt{\frac{n}{i^k}}\)\(k>1\),可以證明覆雜度為 \(O(\sqrt{n}\ln {\sqrt n})\)

星之器

這道題目沒有想出來,我太唐了。

其實知道結論就做出來了,結論是,答案與實際操作無關,就是亂操作即可。

證明:

一維的情況,顯然匹配可以互換,因為一定是 \(i-j\ge0\),所以是對的。

二維也類似。

這樣的話,先把始態減去終態。然後我們直接操作到最後兩列,操作到最後四個格子,因為一定有解,所以都是 \(0\)

正解就是,考慮結論實際是什麼,可以用勢能理解。

我們定義一個位置上一顆星的勢能為 \(f(x,y)\),顯然 \(x,y\) 軸獨立。

\(g(x)\) 表示位於 \(x\) 位置的一顆星的勢能。

那麼 \(g(x_1)+g(x_2)-g(x_1+1)-g(x_2-1)=x_2-x_1-1\)

所以 \(g(x)-g(x-1)-x\) 為定值,容易構造:\(g(x)=g(0)=0\),那麼 \(g(x)=\frac{x^2+x}{2}\)。所以每顆星的勢能可以求了,總的就可以求了。

這種思想值得借鑑!

AGC050A AtCoder Jumper

考慮 \(\bmod n\) 的一個剩餘系,我們容易說明 \(i\times2,i\times 2+1\) 在這個系中每個可以保證每個數出現兩次。

這樣子就一定符合條件了,因為每次經過 \(O(dep)\) 輪一定可以遇到所有數。

ARC155D Avoid Coprime Game

假設我們每次要求 \(g\) 變小,那麼可以直接設 \(f_i\) 表示目前 \(g=i\),先手是否獲勝。

顯然,我們列舉 \(j|i,j\not=i\),那麼 \(f_i=P(f_j),\exist {k},\gcd(a_k,i)=j\),其中 \(P(x)\) 表示所有 \(x\) 的取反的或的值。

繼續觀察一下,現在 \(g\) 可以不變,相當於什麼,相當於我們可以拖延時間。

如果存在一個後繼狀態先手是必敗的,直接走過去即可,否則,先後手就會一直選擇 \(g\) 的倍數,以確保不輸,我們發現,只跟 \(g\) 的倍數數量有關,那麼就可以設 \(f_{i,j}\) 表示目前 \(j\) 輪先手是否敗,容易發現,只有 \(j\) 的奇偶性是重要的,且 \(g\) 的倍數數量恰好就是到最後經過的步數,所以 \(f_{i,b_i\bmod 2}=1\)

答案顯然就是 \(f_{a_i,0}\)

現在需要判斷 \(\exist k,\gcd(a_k,i)=j\),考慮容斥,因為我們很容易計算 \(\sum _{k}[j|\gcd(a_k,i)]\),所以直接減掉倍數,從大到小做即可。

時間複雜度可以做到 \(O(\sum d(n)^2)\)

ARC158D Equation

注意到左邊和右邊都是齊次的,且次數剛好差 \(1\),所以我們想辦法把右邊的式子乘上一個數。

考慮對於一組 \((x,y,z)\),我們設左邊的式子為 \(a\),右邊的式子為 \(b\),若 \(a\not=0,b\not=0,a\equiv kb(\bmod m)\), 那麼我們直接讓 \((\frac x k,\frac y k ,\frac z k)\) 是合法的。

根據打表可以發現,合法的數量很多,所以我們直接隨機 \((x,y,z)\),使得 \(a,b\) 都不為 \(0\) 即可。

可以證明期望次數 \(O(1)\)

CF2002E Cosmic Rays

一個顯然的觀察是,如果每一個 \(b\) 不同,那麼答案就是 \(\max(a_i)\)

兩個 \(b\) 相同的段可以合併,當且僅當中間的數都比他們短,於是可以維護一個數量遞減的單調棧,每次把比當前小的合併,合併就類似,如果當前是同色的,那麼就把剛剛彈出的異色棧頂取出來,兩邊加起來減掉這個數即可。

ARC184D Erase Balls 2D

這道題需要感受。還是需要仔細想想該怎麼做再寫。

先放在二維平面上。

我們考慮,對於一個 \(i,j\),若滿足 \(i,j\) 有那個偏序關係,那麼刪了 \(i\) 就不能刪除 \(j\),反之同理。

考慮 dp,設 \(f_i\) 表示最後一個選擇刪的點為 \(i\) 的方案。

那麼列舉一個 \(j\),保證 \(a_j>a_i\),我們直接轉移顯然會算重,觀察什麼情況不會算重。大概就是,如果存在一個 \(i,j\) 中間夾了一個 \(k\),那麼如果 \(k\) 選不選擇對當前的狀態沒有新的作用的時候,我們就會算重,此時就需要欽定一個代表元。

我們把不存在上述 \(k\) 的進行 dp,容易思考它是正確的,於是直接維護二維字首和即可。

ARC184B 123 Set

這個題真的很厲害!

我們令構造一個矩陣,其中第一個數為 \(1\),向右,每個數等於左邊那個數 \(\times 3\),向下,每個數等於上面那個數 \(\times 2\)。那麼我們需要保證,一個數的左邊和上面至少一個被選,由於 \(\log_3^n\) 很小,可以考慮直接狀壓 dp。

觀察到 \(5,7,\cdots\) 這些數沒有被計算,類似的,我們把這些數也算一下。

容易觀察到,對於一個起點 \(x\),若 \(\lfloor \frac n x\rfloor\) 相同,那麼這個矩陣是等價的,可以一起算,於是直接數論分塊。

狀壓 dp 可以輪廓線 dp 或者直接記錄一下子集和什麼的,反正複雜度能過。

ARC184C Mountain and Valley Folds

可以分治構造 M,由這個構造,容易思考充要條件就是,該位置 \(x\) 的最低二進位制 \(1\) 位後面接了一個 \(1\)

然後就設 \(f(a,x)\) 表示把 \(a\) 中集合裡的數全部加上 \(x\),容易發現只需要記錄 \(x\bmod 4\),轉移直接遞迴,把這一位弄掉即可。可以分析複雜度一定很小,因為每次 \(a_i+x\) 如果是奇數,那麼貢獻確定了。

題解說明這個複雜度是 \(O(n\log A)\) 的。

ARC162D Smallest Vertices

考慮拆貢獻,對於每個點求出合法的方案之和。

考慮這個點的子樹都是大於 \(i\) 的,設子樹中不包括它的點為 \(S\)

那麼根據 prufer 序列可以得知,一個大小為 \(N\) 的有根樹的方案就是,

\[\frac{(N-2)!}{(d_{root})\prod _{i\not=root}d_i} \]

\(i\) 這個子樹看作一個 \(d=0\) 的點,答案就是:

\[\frac{(|S|-1)!}{(d_x-1)\prod_{i\in S}d_i}\times \frac{(n-|S|-2)!}{(d_1-1)\prod_{i\not \in S,i\not = 1,x}d_i} \]

直接設 \(f_{i,j,k}\) dp 即可,需要單獨處理一下 \(d_i=0\) 的一些位置。

Odd Sum Rectangles

特別牛的構造題。

感受一下,我們直接分治構造,每次選取矩形中點。

然後分成四個矩形遞迴構造。

為什麼是對的呢?我也不知道。

ARC162E Strange Constraints

\(c_i=\sum _{j=1}^n [a_j= i]\)

對於兩個數 \(i,j\),若 \(c_i<c_j\),那麼 \(i\) 的可行選取位置構成的集合一定包含 \(j\) 的這個集合,這個是顯然的,因此,我們可以從次數出現多的開始考慮,這樣子當前能填的空位就確定了。

具體的,設 \(f_{i,j,k}\) 表示填完了 \([i,n]\) 次數的點,一共有 \(j\) 種數,其中佔用 \(k\) 個位置,那麼轉移顯然是列舉 \(i\) 次數填了多少次,記 \(x\)

考慮如何從 \(f_{i+1,j,k}\),轉移到 \(f_{i,j+x,k+ix}\),設 \(S=\sum _{j=1}^n[a_j\ge i]\)。方案首先就是選取這 \(x\) 個數的數是什麼,就是 \(\binom {S-j}{x}\),然後在把這 \(ix\) 個數填進去,先選取位置,再多重集組合數分配即可。

可以發現 \(ix\leq n\),而且 \(ji\) 也一定 \(\leq n\),否則 \(f\) 的值一定為 \(0\),因此可以說明覆雜度為 \(O(n^3)\)

AGC067C Divisibility Homomorphism

條件 1: 存在一個數 \(C\),滿足 \(\forall 1\le n,a_n\leq C\times n\)

條件 2: 對於任意兩個正整數 \(n,m\)\(a_n|a_m\) 當且僅當 \(n|m\)

我們需要找到滿足條件的 \(a\) 符合什麼更加有力的條件。


\(P\) 為素數集合。定義,\(v_{p}(x)\) 表示 \(x\bmod p^i=0\),的最大的 \(i\)

首先,顯然 \(2f(u)\leq f(2u)\)

如果 \(f(2^{n+1})=b_nf(2^n)\not=2f(2^n)\),那麼 \(b_n>2\),由於 \(a_n\leq C\times n\),所以 \(b_n\not=2\) 的位置是有限的。

所以存在 \(n_1\),滿足 \(n>n_1\) 的情況下,\(f(2^{n+1})=2f(2^n)\)

同理,存在 \(N_1,c_1\),滿足 \(n>N_1\)\(f(2^n)=2^{n-c_1}f(c_1)\)

引理 1: 對於 \(p_i\in P\),有 \(\frac{f(p_ix)}{f(x)}\ge p_i\),且存在 \(N_i,c_i\),對於 \(n>N_i\),滿足 \(f(p_i^n)=p_i^{n-c_i}f(p_i^{c_i})\)

證明:

我們已經推出了 \(2\) 的情況。

考慮數學歸納法。

假設對於 \(p_1,p_2,\cdots,p_{k-1}\) 都滿足條件,設 \(M\)\(p_1,p_2,\cdots,p_{k-1}\) 的若干個數的乘積。

那麼 \(p_kx\nmid Mx\),可以推出 \(f(p_kx)\nmid f(Mx)\),也就是 \(\frac{f(p_kx)}{f(x)}\nmid \frac{f(Mx)}{f(x)}\)

我們令 \(M=\prod_{i=1}^{k-1} {p_i}^{t_i}\),並使 \(\forall i<k,v_{p_i}(f(p_i^{t_i}))\ge v_{p_i}(f(p_kx))\)

那麼 \(\forall i<k,v_{p_i}(f(Mx))\ge v_{p_i}(f(p_i^{t_i}))\ge v_{p_i}(f(p_kx))\)

由此,\(\forall i<k,v_{p_i}(\frac{f(Mx)}{f(x)})\ge v_{p_i}(\frac{f(p_kx)}{f(x)})\)

根據上面需要滿足 \(\frac{f(p_kx)}{f(x)}\nmid \frac{f(Mx)}{f(x)}\),所以至少存在 \(i\ge k\),滿足 \(v_{p_i}(\frac{f(p_kx)}{f(x)})>v_{p_i}(\frac{f(Mx)}{f(x)})\)

所以,\(v_{p_i}(\frac{f(p_kx)}{f(x)})\ge 1\),所以 \(\frac{f(p_kx)}{f(x)}\) 含有 \(\ge p_k\) 的質因子。

由此,根據 \(2\) 的情況的類似推導,我們證明了結論。

引理 2:\(p\) 是質數,\(p|\frac{f(px)}{f(x)}\)

反證。

假設 \(f(px)=tf(x)\)\(v_p(t)=0\)

\(tf(x)\) 中不包含 \(p\) 的質因子為 \(p_1,p_2\cdots,p_k\)

\(M=\prod_{i=1}^kp_i^{t_i}\)。並且滿足 \(v_{p_i}(f(p_i^{t_i}))\ge v_{p_i}(tf(x))\)

那麼 \(v_{p_i}(f(Mx))\ge v_{p_i}(f(p_i^{t_i}))\ge v_{p_i}(tf(x))\)

對於 \(p\) 這個質因子,\(v_p(f(Mx))\ge v_{p}(f(x))\),因為 \(v_p(t)=0\),所以綜上可以得到 \(tf(x)|f(Mx)\)

所以 \(f(px)|f(Mx)\),與 \(p\nmid M\) 矛盾,於是得證。

引理 3: 對於 \(v_p(x)<v_p(y)\),有 \(v_p(f(x))<v_p(f(y))\)

反證。

設存在 \(x,y\),滿足 \(v_{p}(x)<v_p(y)\) 但是 \(v_p(f(x))\ge v_p(f(y))\)

我們取出來一對 \(x,y\) 滿足情況,需要保證 \(y\) 是滿足情況最小的。

\(p^{v_p(x)+1}|y\Rightarrow f(p^{v_p(x)+1})|f(y)\Rightarrow v_p(f(p^{v_{p}(x)+1}))\le v_p(f(y))\le v_p(f(x))\)

如果 \(y\not=p^{v_p(x)+1}\),由於 \(v_p(p^{v_p(x)+1})>v_p(x)\),且 \(y\) 是最小的滿足情況的數,所以 \(v_p(f(p^{v_p(x)+1}))>v_p(f(x))\),與上述不符。

所以,\(y=p^{v_p(x)+1}\)

\(a=v_p(x)\),則 \(y=p^{a+1},x=p^aB\)

\(f(y)\) 除了 \(p\) 的質因子構成的集合為 \(p_1,p_2,\cdots,p_k\)

\(M=\prod_{i=1}^k p_i^{t_i}\),並且滿足 \(f(y)|f(xM)\),與 \(y\nmid xM\) 矛盾,由此,得證。

這樣我們就找到了題目的等價條件,直接做即可。

AGC066D A Independent Set

首先我們可以考慮最後的答案陣列,一定是若干個 ABABAB 的連續段中間用 B 連線起來的。

考慮 dp,設 \(f_i\) 表示現在確定了前 \(i\) 位的答案,那麼這一位可以填 B,就從 \(f_{i-1}\) 轉移過來,如果是一段 ABABABABAB 之類的,就直接列舉 \(j\) 滿足 \([j+1,i]\) 合法,然後從 \(f_j\) 轉移過來。

假設 \(j,j'(j>j')\) 都是合法的,我們只需要轉移 \(j\),因為 \([j'+1,j]\) 也是合法的一段。

所以這樣子轉移就可以做到 \(O(n)\) 了,觀察一下這樣的極小段有什麼性質。

我們現在需要求 \(w(l,r)\) 表示 \([l,r]\) 所有 A 排到與 \(l\) 奇偶性相同位置的答案。

\(d_i\) 表示字首和,那麼答案就是 \(\sum |d_{i-1}-d_{p_i-1}|\),其中 \(p_i\) 表示 \(i\) 號位置的匹配的點的位置。

聽說可以直接暴力二維數點求,但是可以觀察一下性質。

由於 \([l,r]\) 這裡是極小段。所以我們發現 \(i\) 要麼全部大於等於 \(p_i\),要麼全部小於等於 \(p_i\)。這個性質的具體證明可以考慮反證,即如果存在一個不是這樣的匹配方案一定能調整成這樣子。

所以可以把絕對值移成 \(|\sum d_{i-1}-d_{p_i-1}|\)

直接維護字首和即可。

CF1893E Cacti Symphony

先考慮邊的限制,相當於兩個端點的權值不能相等,且異或和不為這條邊。

手玩一下,可以發現有一個端點一定與這條邊相等,這是顯然的,我們設 \(x\) 與這條邊相等,那麼連單向邊 \((x,y)\)

考慮點的限制,這個點的出邊的權值的異或和要麼是本身要麼是 \(0\),這無關緊要,我們只需要讓剩下的邊異或和不為這條邊就行了,考慮 \(1\oplus 2\oplus3=0\),所以若存在偶數個這樣的邊,最後異或出來要麼是本身要麼是 \(0\),不合法,所以相當於入邊只能有奇數條。

現在轉化成了兩個問題,分別是邊定向以及使得任意兩個點的點權不同。

先看點權不同。

我們注意到這是一個仙人掌,即一個橋連線兩個環,顯然可以把每個環單獨看,然後乘起來,最後乘上 \(\frac{2}{3}\) 的橋數次方即可。一個環的方案。

這個是經典問題,我們可以設 \(f_n\),注意到當 \(n>3\) 滿足 \(f_{n}=f_{n-1}+2f_{n-2}\),理解的話就是考慮 \(n\)\(n-2\) 的顏色關係。然後搜一下發現 \(f_n=2^n+2\times (-1)^n\),需要特判 \(n=1\) 的情況。

邊定向。

我們可以把邊翻轉,相當於要使得出度為奇數。所以根據奇數乘法奇偶性不變,\(n\bmod2=m\bmod2\) 才有解。

我們發現,對於每一個環,把它定向之後,剩下的邊確定了,所以這裡的方案就是 \(2\) 的環數次方。

坑:

  • 附加邊很大,加起來要注意一下。
  • 每個附加邊都有 \(3\) 的貢獻需要算。
  • 附加邊可能會出現橋的情況。

[JOISC2020] 首都

更深的理解點分治!

首先,考慮暴力怎麼做,列舉每一個點,然後使用一個佇列。

每次取出隊頭,看這個點的父親有沒有加入,如果沒有,就直接加入與它父親顏色相同的所有點。

這樣子做顯然是 \(O(n^2)\)

我們考慮點分治,每次只對分治中心和子樹連通塊做這個東西,我們發現它一定會計算到答案。

這是因為任意一個在最優解中的點,在最早一定會存在一個點被遍歷,這個時候所有剩下的點都沒有被刪除。於是 \(O(n\log n)\)

坑:

  • 記得找重心的時候,\(mx\) 陣列要清零。
  • 注意 vector 的清空之類的。
  • 要判斷當前情況時候把所有這種顏色的點放了,否則這種方案顯然是錯誤的。

[JOISC2020] 最古の遺跡 3

神計數題。

我們先考慮如何給定 \(h\) 求出最後的 \(h'\) 陣列。

考慮從後往前做,令 \(h'_i=h_i\),然後判斷 \([i+1,n]\)\(h'\) 陣列是否存在 \(h_i'\),如果存在,則讓 \(h_i'\to h_i'-1\)。反覆進行這個操作,最後得到的就是答案。

考慮 dp,設 \(f_{i,j}\) 表示後 \(i\) 個數,目前 \(h'\) 陣列中 \([1,j]\) 都是出現過的,其它也可能出現,保證 \(j+1\) 沒出現過。

我們把相同的數看成不同的,即分配標號,這樣子方便計數,最後再除以 \(2^n\) 即可。

\(s\)\([i+1,n]\) 需要留下來的數的數量。

如果這個位置不需要留下來,那麼我們顯然是要填一個 \([1,j]\) 的數,原本填了 \(j+n+n-i-s\) 個,現在剩下 \(j-(n+n-i-s)\) 個,方案就是這麼多。

如果這個位置需要留下來。分兩種情況考慮。

  • 如果當前這個位置填的數會在以後才有用處,就貢獻待算,\(f_{i,j}=f_{i+1,j}\)

  • 否則,列舉 \(k\) 表示當前我們填的數是 \(j-k+1\),即把 \([1,j-k]\)\([j-k+2,j]\) 拼接起來,顯然從 \(f_{i+1,j-k}\) 轉移過來。

    這樣子的話。我們考慮要欽定前面的 \(k-1\) 個位置,相當於 \(\binom {s-(j-k)}{k-1}\)

    然後這個位置可以填 \([j-k+2,j]\) 的數以及,\(j-k+1\) 這個數兩次,所以這個位置的方案是 \(k+1\)

    注意我們還需要算上 \(k-1\) 的合法序列的答案,意思就是有 \(2(k-1)\) 個數,構成一個 \(k-1\) 的序列,問操作這個序列變成排列的方案數。

    我們需要觀察一下這個問題,首先考慮序列合法必要性,相當於要滿足 \(\leq i\) 的數的個數 \(\leq i\)。否則一定不合法。考慮充分性,其實發現它一定優於排列,而排列一定合法,所以這樣的序列也一定合法。

    這個就很好 dp 了,直接設 \(g_{i,j}\) 表示 \(i\) 個數目前填了 \(j\) 個位置。

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

坑: 注意 \(j\) 可以取到 \(0\)

AGC019F Yes or No

首先,最優策略肯定是,哪個剩下的多猜哪個。

我們策略是已定的,每次我們只會往著紅色線的方向走。

然後考慮答案序列是怎麼樣的。

容易觀察到,不在這個斜線上的貢獻,一定是 \(\max(n,m)\),你可以試一試,證明就是折一下。

然後剩下的就是過這個斜線的貢獻,我們考慮算出 \((0,0)\)\((n,m)\) 跨過斜線的次數總和,這個可以直接列舉每一個點,然後分兩部分計算方案乘起來。

由於我們最優策略肯定是 \(\frac 1 2\) 的機率選對,所以算出這個東西除以總機率並且乘上 \(\frac 1 2\) 就是這部分的期望,兩部分加起來即可。

大概就是

\[\frac{1}{2\binom {n+m}{n}}\sum _{i=1}^{\min(n,m)}\binom {2i}{i}\binom {n-i+m-i}{n-i}+\max(n,m) \]

gmoj 8248 衝突

\(d_i\) 表示位置 \(i\) 影響的點的個數,我們注意到 \(\sum _{i=1}^m d_i=O(n)\)

於是考慮根號分治,首先對於 \(d_i\ge B\) 的位置,直接暴力,複雜度 \(O(\frac{n^2}{B})\)

考慮 \(d_i\leq B\) 的位置。考慮建虛樹,我們注意到這個時候能夠產生貢獻的點對一共有 \(O(nB)\) 個,直接列舉這些點,然後就判斷關係了(因為你就知道了它們的 lca),然後就是矩形加,需要容斥一下,這樣就做完了。

注意到一共有 \(O(nB)\) 個矩形加,\(O(Q)\) 次詢問,所以可以直接使用 \(O(1)-O(\sqrt n)\) 的分塊維護區間和。

求解 lca 轉化為 RMQ 問題即可。

\(B=\sqrt n\),總複雜度為 \(O(n\sqrt n)\),設 \(n,q\) 同階。

坑:

  • 注意一共有 \(n+1\) 個點。
  • 建虛樹的時候需要把這個點父親弄上去。

gmoj 8249 最大流

考慮一個面我們最多經過 \(2\) 個邊,而且不會只經過一個邊。

可以說明,如果經過這麼面,一定會經過最小的那條邊。

所以我們考慮一個貪心,先把環上的邊加入堆,每次取出最小的,設其權值為 \(e\),把它的那一個面取出來,讓這個面其它的邊 \(+e\) 權值,然後丟進堆裡。

這樣子最後會形成的結構恰好是最小割樹,直接做即可。

現在目的是怎麼找到這個面上的其它邊,我們對這個圖建對偶圖,對偶圖一定是一個樹。具體的,從前往後掃每個點,用單調棧維護目前的連邊情況,每次取出這個點的一條邊,與單調棧的某些邊就形成了面,記錄一下就好了,然後就持續維護這個單調棧即可。

坑: 一定要取模。

AGC068B 01 Graph Construction

連 1800 都想不到,廢了。

一個可行的思路是,讓 \(0\) 的位置儘可能合法,然後考慮 \(1\) 的位置。

如何使得 \(0\) 的位置合法,那肯定是複製

直接講構造。

列舉 \(i\)\(1\)\(n\),每次找到 \(a_i\) 在當前序列 \(a'\) 的第二次出現位置,或者最後一次出現的位置(如果沒有第二次),然後把這個位置刪掉,變成 \(a'\)

比如說:\(32332\)

先考慮第一組,\(00100\\11111\)

然後序列變成 \(3232\),我們現在需要利用 \(0\) 來進行復制。

於是第二組,\(0001\\0000\)。這樣子很好的把第一組的資訊轉移了下來。

然後序列變成了 \(323\),第三組就是 \(001\\000\)

以此類推。

觀察到這種構造方法,很有效的傳遞的資訊,使得複製的新一份陣列與原陣列恰好一一對應。

對於 \(1\) 來說,我們可以發現,這樣子一定會合法的連向上一個的位置,且第一個會連向最後一個位置,所以合法。

這道題目的主要思考突破口是,先考慮 \(O(n^2)\) 的構造,然後我們要仔細手玩一下,並且觀察一下 \(0\) 的可以進行復制操作。

AGC068A Circular Distance

欽定 \(0\) 一定被選上,求出這個,把它乘上 \(\frac{L}{n}\)。相當於每個人都欽定一次,一個選 \(n\) 人的方案有 \(n\) 種欽定方案。

現在考慮求出 cost \(<D\) 的方案數 \(f(D)\),求出之後就可以很好的解決問題了。

首先,\([D,L-D]\) 這個區間的人是不可以選擇,我們假設 \([1,D-1]\) 亂選,剩下的就是 \([L-D+1,L-1]\) 這個區間。

注意到,選某一個 \(i\in [L-D+1,L-1]\),我們不能選 \([i-L+D,i-D]\),恰好覆蓋著 \([1,D-1]\) 這個區間的一部分。

注意這個不能選的區間的長度是定值,設為 \(w=L-2D+1\)

考慮把問題轉化為,在一個長度為 \([1,D-1]\) 的序列中,選擇若干個白點,相當於原序列的 \([1,D-1]\),然後選一些黑點,相當於原序列的區間限制,要使得黑點開始的 \(w\) 長度不能有白點。

現在就好做了,我們先列舉白點和黑點的顏色段總數 \(k\)

有兩種情況,WBWBWBWB 或者 BWBWBWBWB

那麼先把需要留下來空白位置的點數減掉,剩下的直接選,然後直接插板 \(B,W\) 的方案數。

可以發現,顏色段數是 \(O(\frac{n}{D})\) 級別的,所以總複雜度 \(O(L\log L)\)

坑: 對於 \(L-2D+1<0\) 的話,我們直接任選 \(n-1\) 個點即可。

AGC068C Ball Redistribution

先考慮建圖,我們連邊 \(i\to a_i\)

手玩一下,對於一個操作 \(i\),我們會把 \(i\) 的所有入邊刪掉,然後這些點構成一個環。

一些性質:

  • 如果點 \(i\) 不含自環,那麼操作之後,\(i\) 一定在鏈上。
  • 如果點 \(i\) 含自環,那麼操作之後,\(i\) 一定在環上。

只關注 \(i=N\) 這個操作,逆推考慮。

如果 \(N\) 在環上,那麼上一次操作 \(N\) 一定有自環,那麼操作完不可能有兩個點連向它。

如果 \(N\) 不在環上,那麼上一次操作 \(N\) 一定不含自環,那麼操作完不可能有點連向它。

所以,得出結論,充要就是沒有任意除了環上的點連向 \(N\)

考慮擴充套件到 \(i=n-1\to 1\),就很抽象了。

下面給出充要條件,然後證明,具體思考過程感覺很需要猜啊!

充要條件:對於一個點 \(u\),設 \(v_1,v_2,\cdots,v_k\) 表示 \(u\)\(k\) 個兒子,那麼要保證 \(v_1,v_2,\cdots,v_k\) 的每個子樹的結點編號最大值要大於 \(u\)。(兒子指的是不在環上的)

必要性:選擇一個結點 \(v\),它不滿足條件,還有它的兒子 \(u\)。我們發現,無論怎麼操作 \(n\to v+1\)\(u\) 的子樹都不會變,所以最後 \(v\) 會有一個 \(u\) 這個結點,顯然不能逆推了。

充分性:手玩容易發現,操作之後限制會變更松。所以可以構造一組解。

AGC068E Sort and Match

考慮從 \(y_i\)\(x_i\) 連邊,我們發現,這個圖每個點的入度等於出度,這啟示我們考慮尤拉回路。

考慮從 \(1\) 號結點遊走,每次經過一個我們沒有經過的出邊,然後類似操作,最後回到 \(1\),然後對 \([2,n]\) 也做類似操作。

我們發現,每一個欽定出邊的順序,恰好對應了原題中一個 \(x_i\) 的順序,所以上面這個過程與這個題構成了雙射。

於是,直接設 \(f_{i,j,k}\) 表示走了 \(i\) 步,目前是從 \(j\) 這個結點遊走的,到了 \(k\),顯然需要滿足 \(k\ge j\)

然後就可以列舉下一步轉移。

由於題目有 \(x_1=k\) 的限制,所以就直接倒著 dp,然後列舉 \(x_1\) 是什麼貢獻到這個答案即可。

時間複雜度 \(O(n^4)\)

gmoj 8298 氣泡排序

我只能說,題解就是**。

一個很厲害的一步,先把偶數位置乘上 \(-1\)

現在問題轉化成,每次可以交換相鄰兩個位置,最後要求:

  • 對於奇數位置,要滿足 \(a_i+a_{i+1}\leq 0\)
  • 對於偶數位置,要滿足 \(a_i+a_{i+1}\ge 0\)

而且,原序列一定是負的很大值到 \(0\) 到正的很大值,由此,

一定存在一個 \(p\),滿足

  • \(\forall i\in [2,p],|a_{i-1}|\ge |a_i|\),且 \(a_{i-1}\)\(a_i\) 的符號不同。
  • \(\forall i\in [p+1,n-1],|a_i|\leq |a_{i+1}|\),且 \(a_{i}\)\(a_{i+1}\) 的符號不同。

所以我們考慮按絕對值從大到小填數,每次填絕對值相同的一些數。

\(f_{i,j,k}\) 表示填了 \(\ge i\) 的數,目前左邊是負號,右邊是正號。

轉移的話,直接列舉有多少個數去到左邊,其它去到右邊,由於正負交替,容易算出其數量,而且,我們容易知道,對於正的數,其一定是不改變原先順序的,負的同理,所以可以確定每一個數具體放在哪個相對位置。

考慮如何算貢獻,貢獻有幾類:

  • 一種是比 \(i\) 小的數,那麼我們移動當前數,一定會有位置在它前面的數的貢獻,這個可以直接記錄一下字首和和字尾和。
  • 一種是可能會出現交叉的情況,具體的,我們需要把向左的數看成 \(1\),向右的數看成 \(0\),那麼就需要加上 \(1\) 左邊 \(0\) 的數量,\(0\) 右邊 \(1\) 的數量。
  • 一種是對於都向左的正和負,可能會產生貢獻,這部分也可以直接求一個字首和字尾和。

上面這三種都可以使用 BIT 維護。

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

坑:

  • 初始化要注意,如果 \(n\) 是偶數,那麼兩邊第一次都只能填負數。如果 \(n\) 是奇數,則一邊填負數一邊填正數。
  • 清空直接的 BIT 記錄的時候,最好使用棧存下來 \(+\) 的位置。
  • 注意一些邊界,不要使得 vector 越界了。

gmoj 8265 見證者

首先,\(n\times m\equiv 1(\bmod 2)\) 無解。

我們先讓 \(m\) 變成偶數,然後對網格圖進行黑白染色,匹配邊的兩端顏色肯定不同。

建立矩陣 \(G\),滿足 \(G_{i,j}\)\(1\) 當且僅當左部的 \(i\) 到右部得 \(j\) 有邊。

二分圖完美匹配,相當於這個矩陣的積和式,難以計算。

下面我們說明,把豎著的邊的權值變成 \(i=\sqrt{-1}\) 即可,直接求出行列式即可。

我們先欽定 \(L_i\)\(R_i\) 的邊被選中,如上圖。

然後考慮在網格圖上隨意加入一個完美匹配,我們發現,會形成若干個環,顯然這個環是 \(i\to p_i\) 的邊和選中的邊交替形成。

容易發現,一個點會回到自己,所以環裡面豎邊的數量一定是偶數,同理,環裡面被選中的邊,和其餘的橫邊數量之和也是偶數,所以環的大小一定是偶數。

行列式的 \((-1)^{\sigma(p)}\) 相當於 \((-1)^{n-\textrm{cyc}(p)}\),而且 \(n\) 是偶數,可以不考慮。

我們現在想要抵消掉 \((-1)^{\textrm{cyc}(p)}\),只需要每個環的 \(i\) 的乘積是 \(-1\) 即可。

那麼指數肯定是 \(4k+2\) 的形式,只需要證明豎邊 \(\frac{1}{2}\) 是奇數。

觀察上圖,我們發現奇數行和偶數行的選中的邊的關係相反。

考慮從一個點行號最小列號最小的點 \(u\) 出發,繞著環走回到該點。顯然最下方的方向與最上方的方向相反,於是,豎的差為奇數,由此得證。

觀察到 \(i\equiv86583718(\bmod 998244353)\) 所以直接行列式就可以 \(O(n^6)\)

我們考慮主元法,具體的,把每一行都消到只有 \((1,1),(1,2),\cdots,(1,m'),(i+1,j)\) 一共有 \(m'+1\) 個變數(這裡指的是矩陣的座標)。

我們用這一行去消 \((i+1,j-1),(i+1,j+1),(i+2,j)\) 這三個行即可。

最後,我們發現對於大於 \(n-m'\) 的這些位置,只有 \((n-m',1)\to (n,m')\) 有值,直接對這部分高斯消元即可,剩下的就是一個對角線乘起來,注意要計算逆序對數量。

每一行我們存一下前 \(m'\) 個位置和下方那個位置。

可以做到 \(O(n^3)\)

gmoj 8269 基礎NPC練習題

對於前兩個點,直接做。

第三個點,直接亂模擬退火。

第四個點,直接欽定 \(c_{i,j}=C_{j-i}\)

第五個點,直接欽定 \(c_{i,j}=C_{j-i}=C_{n-(j-i)}\)

第六個點,發現 \(n=n'\times 3-1\)。直接把第五個點的 \(C\) 擴充一下即可。

\([1,n'-1]\) 使用 \(C\)\([n',2n'-1]\) 使用 \(5\),後面也使用 \(C\)

gmoj 8273 詞典

考慮一個想法,我們把每一個 \(s\) 串分成若干個子串,使得這些串是 \(t\) 的子串,並且使得相鄰兩個這種串並起來不是 \(t\) 的子串,下面稱為段。

然後,我們可以證明,兩個串合併的時候,只需要考慮中間的四段。

由於這些段都是 \(t\) 的子串,所以我們可以貓樹分治預處理一些資訊,使得每次查詢從 AC 自動機的 \(st\) 號結點出發,經過 \(t[l,r]\) 的最終位置和權值。

但是兩個串合併的時候,可能會中間兩個並在一起,此時我們可以證明還是隻需要考慮之前的那幾個段,所以我們只需要維護每一個串前兩個段後兩個段即可。

貓樹分治,可以對於每一個 \(st\),儲存一些東西,然後我們先遍歷小區間,把初始位置全部求出來,就可以更新大區間了,這個就很想倍增。

總的時間複雜度就是 \(O(|T|^2\log |T|+|S|+q)\)

實現細節較多,很繁瑣。

gmoj 8270 暴力

考慮令 \(x=a^{a^{a^{a^{\cdots}}}}\)。即 \(a\) 的冪塔,這顯然合法。

所以我們只需要求出這個值 \(\bmod \textrm{lcm}(n,\varphi(n))\)

所以考慮求出這個值 \(\bmod n,\bmod \varphi(n)\) 的值,然後 exgcd 合併。

現在只需要求出冪塔 \(\bmod p\) 的值。

可以遞迴處理,求出冪塔 \(\bmod \varphi(p)+\varphi(p)\) 的值,然後快速冪一下。

這樣子複雜度是很小的,可以算一下。

gmoj 8271 XYH和AEY的染色遊戲

注意到,直接設 \(f_{i,j,0/1}\) 表示左邊有 \(i\) 個顏色已經定了,右邊有 \(j\) 個顏色已經定了,上一次操作的是左邊還是右邊,那麼這次就必須反過來。

容易發現,轉移列舉 \(k\) 表示新增的顏色,然後貢獻是一個類似平行四邊形的東西。

由於 \(v\) 隨機,直接讓 \(k\leq B\) 即可,\(B\) 是一個常數。

gmoj 8272 構造

考慮 \(a+b=(a\oplus b)+2(a\and b)\)

那麼前面那個容易發現,前面那個數的 \(1\) 連續段中最多包含第二個數的一個 \(1\)

所以,考慮構造出一個東西,使得前面那個數異或上這個東西實現進位。

相當於要把連續段的從第二個數 \(1\) 開始的位置變成 \(1\)

可以考慮倍增,然後注意不能越過 \(0\),所以需要對 \(0,1\) 都倍增。

最後左移一下或上自己就是構造的東西。

\(O(\log n)\) 級別的。

gmoj 8276 醉人的葡萄酒

先特判 \(A=1\) 或者 \(B=1\)

對於每一位單獨考慮。

考慮 \(A=2\)\(B=2\) 怎麼做,我們發現,每一行的異或和和每一列的異或和都不變。可以證明,設 \(x\) 表示行異或和等於 \(1\) 的數量,\(y\) 為列的這個數量,答案就是 \(\max(x,y)\)

我們定義一個四元操作,表示在原矩陣中選擇相同的數操作 \((x,y),(x+1,y+1),(x+1,y),(x,y+1)\) 這四個位置。其中操作某個位置表示把以它開頭的 \(A\times B\) 的矩形異或上一個數。

那麼這麼操作,會使得 \((x,y),(x+A,y),(x,y+B),(x+A,y+B)\) 這四個位置異或上一個數,其它位置不變。

考慮 \(x,y\) 對於 \(A,B\) 的同餘系,構成了 \(A\times B\) 個矩陣。

由於我們可以歸納,所以可以轉化到第一行第一列,剩下的部分就直接做 \(A=B=2\) 的情況。

複雜度 \(O(2^{n-A+m-B+1}AB\log a)\)

gmoj 8268 基礎數論練習題

考慮 min-max 容斥,轉化為求一個素數集滿足這個集符合條件的期望最小時間。

設選出來的素數集為 \(S\)\(p=\prod_{i\in S}p_i^{\alpha_i+1}\),那麼當前的期望就是 \(E=1+\frac{\lfloor \frac n p\rfloor}{n}E\),可以解出 \(E\),當然這個不是最終的次數,最後我們需要選取一次,次數還需要 \(+1\)

觀察到若 \(m=1\),那麼容斥係數為 \(-\mu (p)\)

注意到,在狄利克雷卷積下,\(\mu (x)=\prod (1-x^p)\)

於是考慮擴充 \(\mu\) 的定義,設 \(\mu '(x)=\prod(1-x^{p^{\alpha+1}})\)

我們發現這個多項式的第 \(p\) 項取反恰好是 \(p\) 的容斥係數。

現在可以直接對 \(p\) 整除分塊,相當於求出 \(\mu'\) 的字首和,注意到,我們只需要算出上界是 \(\lfloor\frac{n}{x}\rfloor\) 的字首和,設 \(s(x)\) 表示前者。

所以,先對 \(\mu\) 算一次,然後每次我們相當於需要乘上或除上一個 \(1-x^k\)

觀察到這個很像狄利克雷字首和。

對於乘法,只需要讓 \(s(x)\) 減去 \(s(xk)\) 即可,對於除法,只需要讓 \(s(x)\) 加上 \(s(xk)\) 即可(要反過來)。

所以時間複雜度就是 \(O(n^{\frac 2 3}+(\sqrt n +w)\log n)\)

坑: 使用杜教篩的時候,最好不要用 map,還是直接用兩個陣列儲存就行了,因為查的點值一定是 \(\lfloor\frac{n}{x}\rfloor\)

gmoj 8313 交換位元

\(p_i\) 表示 \(i\) 最後的位置。

考慮把 \(i\)\(p_i\) 連邊,觀察圖的形態是怎麼樣的。

我們發現,圖由若干個環組成(廢話),且每一個環,都是形如,

即,一個點出去到達若干個點,回來的時候必須得把沒有經過的點經過。

首先列舉 \(C\in[2,n-1]\),那麼設 \(f_{i,j},g_{i,j}\) 分別表示前 \(i\) 個已經閉環了,沒有閉環且 \(i-1\) 這個位置不知道誰連向它的方案,\(j\) 表示目前長度等於 \(C\) 的個數。

注意,這裡的 \(g_{i,j}\) 計數的是長度大於等於 \(3\) 的環,即自環和二元環我們需要自行討論。

那顯然,\(f_{i,j}=f_{i-1,j}+f_{i-2,j}+2g_{i,j}\),其中 \(2\) 表示欽定順序。

然後 \(g_{i,j}=\sum f_{k,j-[i-k-1=C]}+g_{k,j-[i-k+1=C]}\)

類似的,若 \(C=1\),我們就把狀態改為長度不為 \(1\) 的,這樣子方便一點。

我們注意到 \(j\) 最多隻有 \(\frac{i}{C-1}\),所以可以做到 \(O(n^3\ln n)\),使用字首和最佳化可以做到 \(O(n^2\ln n)\)

gmoj 8314 樹上排序

很神奇的題目。

我們先考慮如果從上往下做怎麼做,顯然,直接每次找到子樹內相同的換即可。我們可以說明,若這個操作不合法,那麼原題不合法,否則合法。

於是,我們現在需要調整。設上面那個問題 \(i\) 需要跟 \(to_i\) 變換。

依次列舉 \(i\),每次我們相當於要把 \(i,to_i\) 先交換,考慮指向 \(i\) 的點和指向 \(to_i\) 的點。

顯然,指向 \(i\) 的點會指向 \(to_i\),指向 \(to_i\) 的點且為 \(i\) 祖先的點會指向 \(i\)

我們對與每個結點,以深度建立平衡樹即可維護,注意要實時維護 \(to_i\),由於 \(i\) 是按順序的,因此,只需要每次更改平衡樹根的時候記錄一個編號最小值更新一下即可。

Chodzenie po linie

首先,我們肯定是把它分成一段一段做,然後段與段之間是不能互相到達的。

對於一個初始點 \(x\),我們肯定是找到其上邊最左的點,其右邊最下的點,然後過去,所以,我們發現,可以用二元組 \((x,y)\),注意這分別都是點的編號,來維護目前可以到的矩形。

我們考慮左下的不可到達點,右上直接翻轉序列再做一遍即可。

考慮把 \(dis(x,y)\),拆成列舉一個 \(k\),求有多少個 \(dis(x,y)\ge k\)

那麼每次我們相當於一個左下的矩形不能到達,直接二維數點即可。

直覺上告訴我們這個走的過程總次數很少,事實上是 \(O(n\sqrt n)\) 的,現在我們來證明。

\(B=\sqrt n\)

對於經過的點對 \((x,y)\),總有 \(x<y,p_x>p_y\)(起始點除外)。

對於某個 \(x\),我們取出所有滿足 \(x<y\)\(p_x>p_y\)\(y\) 並按照 \(p_y\) 排序,記為 \(b_{x,1},b_{x,2},\cdots,b_{x,k}\)

我們稱 \((x,b_{x,1}),(x,b_{x,2}),\cdots,(x,b_{x,B})\) 是好點,其它是壞點。

考慮從 \((x,y)\) 開始走,每次經過一個壞點 \((x,y)\) 下一次 \(y\) 一定會變成 \(b_{x,1}\),因此 \(p_y\) 至少變小了 \(B\),而整個過程 \(x+p_y\) 是不升的,所以至多經過 \(\frac{n}{B}\) 個壞點,同時好點的總數不超過 \(nB\),所以總的點數是 \(O(n\sqrt n)\) 的。

我們可以直接把一個二元組到達的二元組連邊,變成一棵樹,直接在上面做一個累加即可計算答案,但是這樣子常數很大。

我們注意到,對於同一個 \(x\),若干個 \(y\),這些二元組的到達的二元組是 \(y\) 遞減的。

所以直接對於每一個 \(x\) 維護一個 vector 然後每次看一下末尾元素是否相同就可以判斷插不插入了,這樣子就可以快速把樹建出來。常數非常小!

二維數點一共由 \(O(n)\) 次插入,\(O(n\sqrt n)\) 次查詢,所以使用 \(O(\sqrt n)-O(1)\) 的分塊即可。

gmoj 8300 最短路

終於過了!

我們考慮先求出最短路,然後修改邊權,即,將 \((u,v,w)\),變成 \((u,v,d_u+w-d_v)\)

我們考慮那麼每次我們相當於要將最短路樹上 \(1\)\(u\) 的路徑反向,然後求 \(1,u\) 在新圖的最短路,最後加上最短路乘以 \(2\) 即可。

注意到,新圖有什麼性質呢,我們發現最短路樹上的邊都為 \(0\)

考慮設 \(f_u\) 表示第二次的最短路,那麼每次我們考慮取出一個最小的 \(f_u\),進行轉移。

顯然,如果存在邊 \((u,v,w)\) 且滿足這條邊不在最短路樹上,那麼,可以直接轉移到 \(f_v\)

其次,我們把這個點出發分成若干個連通塊,我們考慮從連通塊轉移到連通塊,如果存在 \((x,v,w)\),滿足 \(x,v\) 不在一個連通塊,那麼可以 \(f_u\) 轉移到 \(f_v\)。因為可以直接走到 \(x\) 號點。注意到,這樣的邊是隻會被計算一次的,所以用完就刪了。

那麼我們每次相當於分治遞迴到若干個連通塊繼續做。

注意到這個過程,我們每次可以不取出最大的那個連通塊,然後把單向邊存在兩個點,分別都轉移一下。

這樣子複雜度就類似 DSU on tree,即可透過。

講一下實現細節,我們使用並查集維護出邊,這樣子保證複雜度,就相當於如果 \(i\) 以後不會遍歷了,就連邊 \((i,i+1)\)

然後直接多路 bfs 即可,可以做到 \(O(n\log n)\)

還有一種更好寫的做法,直接列舉倍增點的數量,如果走完了就相當於這個不是最大的,這樣子是 \(O(n\log ^2n)\) 的。

可能我寫的太醜了,\(O(n\log n)\) 常數很大。

gmoj 8312 三重數

我們肯定是從左到右用棧去維護,棧最後一定為空。

暴力做法,就是我們考慮建成一棵樹,我們發現可能會算重,什麼情況會算重,就是前面合法了,轉化到樹上就是相鄰兩個結點的權值不同。

於是,我們設 \(f_{i},g_i\) 分別表示樹和森林的方案數,還需要記錄一下前導 \(0\),還有是否有不同權值這種東西,直接 \(O(n^2)\) 轉移,沒有前途。

我們把一個棧空到棧空的過程稱之為關鍵步驟,那麼總序列肯定是由若干個關鍵步驟構成。

於是設 \(F\) 表示欽定第一個數確定的關鍵步驟的生成函式,根據暴力的樹的一個性質,可以得到,\(F=x(\frac{1}{1-9F})^2\)

而我們需要求 \([x^{\lfloor\frac L 3\rfloor}]\frac{1}{1-x}\frac{9F}{1-10F}\)

注意到,\(F\) 的複合逆為 \(G=x(1-9x)^2\)

\(H=\frac{1}{1-G}\frac{9x}{1-10x}\),則所求的是 \([x^{\lfloor\frac L 3\rfloor}]H(F)\)

使用擴充套件另類拉格朗日反演,可得 \([x^n]H(F(x))=[x^n]H(x)G'(x)(\frac{G(x)}{x})^{-n-1}=[x^n]\frac{9x((1-9x)^2-18x(1-9x))}{(1-10x)(1-x(1-9x)^2)}\frac{1}{(1-9x)^{2(n+1)}}\)

後面那部分是插板法,前面直接對比係數即可。

gmoj 8296 異或冪和

考慮展開 \(k\) 次方,相當於要選擇若干個數 \(c_1,\cdots,c_{l}\),然後計算這些數的貢獻。

直接列舉不太可行,我們考慮分塊,把 \(30\) 分成 \(8\) 塊,每塊 \(4\) 個數。

我們先列舉分別在哪些塊,只把這些位置摳出來,得到一個 \(2^{16}\) 的數,然後做異或卷積,並且做一個高維字尾和。

那麼如果我們已經定了選哪些數,就可以 \(O(1)\) 得到這個貢獻了。

於是,此時再列舉每一個塊選了哪些數即可。

gmoj 8293 黑箱博弈

我們注意到,充要條件即為,每一個點被覆蓋的區間的種類集合不能相同。

\(f_{n,m}\) 表示 \(n\) 個黑箱,\(m\) 個區間的答案,寫成生成函式 \(F_n(x)=\sum _{m}f_{n,m}x^m\)

考慮容斥,那麼總的就是 \((1+x)^{\frac 1 2n(n+1)}\),把不合法的減去。

考慮把覆蓋種類集合相同的點染上同樣的顏色,取出每一個顏色的最左端和最右端,構成一個新區間。

那麼我們可以說明,他們構成的區間一定不會相交但不包含,即要不包含要不不相交,反證法即可。

考慮列舉最上層的區間一共有多少個,那麼可以把這個問題轉化為一個子問題,然後段內部直接任取即可。

具體的,\(F_{n}(x)=(1+x)^{\frac{1}{2}n(n+1)}-\sum _{i=1}^{n-1}F_i(x)[y^n](\sum _{j=1}^{\infin}(1+x)^{\frac{1}2(j-1)(j-2)}y^j)^i\)

直接拉格朗日插值即可做到 \(O(n^5)\)

gmoj 8328 基礎數論練習題

注意到,\(d(\prod_{i=1}^na_i)=\sum _{\forall i\in [1,n],b_i|a_i}[\forall j\not=k,\gcd(b_j,b_k)=1]\)

考慮對於一個 \(b\),一定是分成若干個質因數集合 \(S\),以及一堆 \(1\),顯然 \(S\) 中每個數只能出現一次。

那麼我們只需要對 \(|S|\) 進行 dp,然後算一下組合數就可以算出最終答案,需要 dp 的是 \(\prod_{x\in b} \lfloor\frac m x\rfloor\)

然後直接把這個 \(S\) 狀壓即可,把最大質因子的數放在一起轉移,然後發現 \(>\sqrt m\) 是沒有用的,稍微剪枝即可做到 \(O(m\pi (m)2^{\pi (\sqrt m)})\)

AGC057F Reflection

一定要仔細思考再去寫。

我們把 \(a,b,c\) 寫成 \((b-a,c-b)\) 的形式,另外我們還有一個 \(b\pm x\)\(x\)

我們把二元組寫成 \((a,b)\)

首先觀察一下這個圖(這個圖有問題啊,要往左平移一格),我們發現,一個位置是 \((a,b)\),還是 \((b,a)\),只取決於最後一步是 \(+\) 還是 \(-\)

我們先把這個 \(\pm x\)\(x\) 序列求出來,設為 \(a_i,b_i\),表示 \(a_i\) 這個數 repeat 了 \(b_i\) 次。

先考慮轉化問題:

我們需要對於這個序列的每一個字首 \(i\),求出每個數選 \(+\)\(-\) 的方案數,要求最後到達同一個數只算一次。

注意一下,對於不是 \(a=b\) 的位置,我們是欽定最後一步選 \(+\) 還是 \(-\),然後對前面的步驟做上面的事情,可以直接對前面的步驟做,然後乘以 \(2\)

這個其實等價於選擇若干個數,可以不選,選擇的數相當於變成 \(+\),所以其實是一個揹包問題。

直接做這個揹包問題肯定是不合理的,我們考慮挖掘 \(a_i,b_i\) 的性質。

修改一下上面 \(a,b\) 的定義,我們不考慮最後一個 \(1\),把它拎出來單獨看作一個數,設一共有 \(k\) 種數。

分別有幾個性質:

  • \(\forall 1\leq i\leq k-2,a_i=b_{i+1}a_{i+1}+a_{i+2}\)
  • \(a_{k-1}=b_{k}a_k+1\)

考慮怎麼計數才能不會算重,我們發現,如果 \(a_{i+1}\) 全都被選了,\(a_{i+2}\) 也選了至少一個,且 \(a_{i}\) 還沒有全部被選,顯然可以把 \(a_{i+1},a_{i+2}\) 轉化成 \(a_i\)。即,如果 \(i\) 沒有全部被選,\(i+1\) 全部選了,那麼 \(i+2\) 不能選,這樣子就可以保證計數是合理的。

最後我們還需要算一下含有最後一個 \(1\) 的情況,我們可以說明,答案就是前面的方案 \(+1\),因為只有在所有數都選擇的時候才會產生貢獻。

我們可以先用 dp 求出不考慮最後一個 \(1\) 的這個字尾的方案,設為 \(s\)

那麼最後一個 \(1\) 的情況有 \(2(s+1)\) 種。

然後再用 dp 算出除了 \(a=b\) 的答案,比如說,對於序列 \(7,3,3,1,1\),你需要計算 \(\varnothing;7;7,3;7,3,3\) 這些的貢獻,對應到原問題就是 \(7,3,3,1\) 的每個字首的貢獻,注意要乘以 \(2\),然後加上 \(7,3,3,1,1\) 的貢獻 \(s\),這個只用算一次,最後加上初始的一種,就是答案。

所以我們第二次 dp 的時候需要把最後兩個數剔除。

時間複雜度與輾轉相除法類似,就是 \(O(T\log (C-A))\)

gmoj 8237 Permutation

考慮 dp,設 \(f_{i,S}\) 表示前 \(i\) 個目前構成的數為 \(S\),每次新增一個數直接計算貢獻。發現狀態數很少,直接 unordered_map 即可。

gmoj 8238 jewel

考慮設 \(f_{S,i,j}\) 表示目前還剩下 \(S\) 集合裡的寶石,其中先手在 \(i\),後手在 \(j\),先手與後手差的最大值,可以顯然的轉移。

但是我們發現這樣子有 \(S\) 轉移到 \(S\) 的情況,這樣顯然會有問題。

對於 \(S'\) 轉移到 \(S\),我們倒著做,直接從小往大列舉 \(S\) 即可。

否則,我們先處理出來一個陣列 \(g_{i,j}\) 表示當前的最大值,即如果一個點的狀態已經確定了,在有向有環圖中就是無入度的點,就先把 \(g\) 當成這些值。

然後,每次我們取出最大的 \(g_{i,j}\),我們考慮用這裡的 \((i,j)\) 去更新其它位置,每次我們都這麼做,直到 \(g_{i,j}\leq 0\),就不做了。

分析一下這樣做的正確性,我們發現,每一個強連通分塊的 \(f\) 的絕對值不會大於 \(\max(g)\),所以我們每次取出最大值一定是對的,而且如果 \(g\leq 0\) 了,那麼走出強連通一定會劣,所以這個時候環上的狀態的 \(f=0\)

需要去做一下過河卒!

gmoj 8338 百萬富翁

我們每次嘗試刪除一段字尾,具體的,每次隨機兩個 \(x,y\),然後對所有數問一遍,設 \(l\) 為成功的次數,我們想要 \(y-x+1\leq x\leq y\leq n\leq x+y-1\)

觀察到這個區間長度如果不對 \(n\)\(\min\) 一定是奇數,所以我們可以有 \(\frac 1 2\) 的機率獲得偶數,並且需要保證 \(x,y\) 都在區間內,所以需要滿足 \(l\ge \frac 2 3n\)

這樣子我們就把序列分成了很多段。

然後對於最後一個包含一的段跑暴力,求出 \(1,2,3\)

這個時候就可以考慮分治了,具體的,如果前面分的段在這個 \([l,r]\) 中,就可以直接分治,否則就直接取 \(mid=\min(\frac{l+r}2,2(l-1))\),這樣子我們一定能把 \([l,mid]\) 查出來,然後遞迴下去即可,由於我們知道了 \(1,2,3\),所以這樣做是合法的。

這樣子還是不能夠 AC,我們還需要讓前面的部分常數較小,就是如果當前問對的次數比上問的次數已經不太能夠使得 \(l\ge \frac 2 3 n\) 了,就直接退出重做。

詢問次數 \(O(n\log n)\)

gmoj 8240 玩遊戲

我們先判無解,剩下的就是儘量使得兩個數一起被操作。

\(=k\) 看成 \(1\),小於的看成 \(0\),大於的看成 \(2\)

什麼時候兩個數可以被一起操作,我們考慮連邊。\((0,2),(2,0)\) 可以連邊。

然後如果是 \((0,1,2),(2,1,0)\),也可以連邊 \(0,2\)

那麼我們發現最終序列形成了若干個鏈,相當於我們要求最大匹配,然後用總的 \(0,2\) 數量減去最大匹配。

考慮把序列拆分成連續段,當出現 \(a,a\),或者 \(a,1,a\) 的時候,就拆分段,我們發現,每一段的內部都是一個鏈,只需要計算每一段內部的 \(0,2\) 的數量除以 \(2\) 即可。

這樣可以做到 \(O(nq)\),顯然可以直接對於每一個值域預處理,然後用 set 維護連續段,使用樹狀陣列維護區間 \(0,2\) 的數量和,每次值域擴大,相當於修改若干個位置。我們每次修改一個位置最好是把 \(x-2,x-1,x,x+1\) 這四個位置後的空隙都判一下。

時間複雜度為 \(O(n\log n)\)。常數巨大,需要使用若干個卡常技巧。

坑: 注意修改樹狀陣列的時候答案會變,要更新一下,注意一下先後順序。

卡常技巧: 樹狀陣列如果查詢的區間小,直接跑暴力,會最佳化 0.1~0.2s。

gmoj 8241 異或

很套路的題目。

我們考慮列舉一個點,列舉半徑,要求關鍵點在圓上,這樣子顯然是有單調性的,可以二分半徑。

現在相當於有很多個圓,對於兩個圓,交出一段弧,那麼關鍵點肯定是儘量在端點上。

所以我們就可以把每一個點對應一些區間,然後區間上有權值,現在問題就是,是否存在一個點,每次包含這個點的區間的權值異或和最大 \(\ge k\)。顯然可以掃描線加線性基,只需要維護一個時間戳即可,每次如果時間戳比原本優,就直接替換。

然後就可以做到 \(O(n^2\log ^2V)\)

我們想到一個套路,字首最大值的期望次數是 \(O(\log n)\) 的。

所以可以每次判斷當前是否能取到之間的答案,如果連之前答案都取不到,那就廢了,直接 continue。否則再進行二分。

這樣子時間複雜度就是 \(O(n\log ^3V+n^2\log V)\)

ARC170F Edge Deletion 2

考慮一個貪心過程,列舉 \(1\to n\),每次到一個點,就對它目前的答案進行貪心。

比如說,一開始我們就在 \(1\) 打上待定標記,並且把 \(1\) 的出邊全部打上這個標記。

我們取出這個點出邊中最小的權值或者是最小的待定權值,那麼如果是確定的權值,直接把這條邊斷掉即可,否則就可以確定另一個點的權值。

具體的:

遍歷 \(1\to n\),對於當前點 \(i\),如果當前點的度數為 \(1\),且有待確定值,那麼肯定確定這個待確定值,以保證 \(i\) 的答案是 \(0\)

否則,我們在它出邊找到一個點 \(x\),滿足這個點確定值和待確定值得其中一個比較小,如果是確定值比較小,直接斷掉這條邊,如果是待確定值比較小,就讓待確定的那個點定權值,待確定它得那個點和待確定這個點斷邊,以及這條邊也斷掉。

如果找不到 \(x\),就只能在 \(i\) 這個位置打上待定標記,把其出邊全部打上這個標記。

注意存在一種情況,\(y,z\) 互相待定,此時遍歷到 \(x\),其中 \(y\) 只有 \(x,z\) 兩條邊,這樣子我們不能遍歷 \((x,y)\) 這個出邊。如果最終 \(z\) 選了了 \(y\),那麼 \(y\) 一定只能選擇 \(x\),相當於這條邊一定會斷掉,所以不能考慮這條邊。

實現的時候,刪邊一定需要把當前能確定的點給確定了,否則會出錯。

set 維護,時間複雜度 \(O(n\log n)\)

AGC048E Strange Relation

\(B_i=A_i+x_iT\)

我們肯定是對於每一個 \(i\),讓 \(x_i\) 從大到小列舉,如果合法就確定。

顯然,不存在 \(B_j\in[B_i,B_i+T),j<i\),否則我們就可以增大 \(x_i\) 了。

這啟示我們,如果我們刪掉 \(i\),那麼對於 \(j>i,B_j>B_i\)\(B_j\),其減去 \(T\) 是不會影響 \(B\) 的相對順序的。

由此,加入 \(i\) 也是不會影響相對順序的(此題的重要結論),所以可以列舉是第幾個位置 \(i\),列舉它選了啥,然後倒著從 \(i\)\(1\) 做一個 dp,每次加入一個位置,看一下這個 \(i\) 的貢獻變化情況。

Jump

首先,考慮問出來一個 \(T\) 使得 \(S\)\(T\) 的相同位置數量為 \(\frac n 2\)

考慮我們每次把最左邊的 \(0\) 變成 \(1\),中間一定存在一個時刻滿足情況,感受一下!

然後考慮問出了 \(T\) 之後,我們固定一個位置,每次查詢這個位置和其他位置,讓這兩個位置都翻轉(\(0\to 1,1\to 0\)),如果還是 \(\frac n 2\),說明這兩個位置正確性不同。詢問 \(n-1\) 次就可以得到每個位置的正確性的相對關係。

那麼就可以再使用 \(2\) 次操作,這樣子的次數是 \(n+n\) 的,考慮把前面那個部分換成隨機化,即每次隨機一個序列,可以證明這樣子的次數是優秀的,\(500\) 次問不出來的機率大概是 \(10^{-6}\) 級別。

Sorting Game

考慮每次讓 \(n\to n+1\),會發生什麼。

我們考慮最左邊的 \(1\),和最右邊的 \(0\),感受一下,這段區間內 \([1,n]\) 中的數一定要相同,否則我們就一定不能換,剩下的就是子問題啦。

具體來說,考慮列舉上面的區間長度 \(k\),那麼可以遞迴到子問題 \(n,m-k+1\)

還有一種情況是 \(k=0\),也是一個子問題。你觀察到這個是一個字首和最佳化,於是做完了,時間複雜度 \(O(n^2)\)

AGC030C Coloring Torus

挺好玩。

我們考慮如何構造 \(n=K\),可以迴圈移位:

1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3

注意到,我們可以替換每一種數的某偶數位,注意需要保證 \(n\) 為偶數。

比如說:

1 2 3 4 5 6
2 3 4 5 7 1
3 4 5 6 1 2
4 5 7 1 2 3
5 6 1 2 3 4
7 1 2 3 4 5

這樣是合法的,所以我們一定可以構造出 \(2n\) 的情況。

ARC141D Non-divisible Set

注意題目給了 \(a\leq 2m\),這是一個很隱藏的條件。

我們把 \(a_i\) 表示成 \(x_i\times 2^{p_i}\),那麼可以說明 \(x_i\) 只會出現 \(m\) 次,而且對於同一個 \(x_i\),只能選一次,而且我們要求選 \(m\) 個,所以題目就轉化了。

考慮對於 \(x_i,x_j,p_i,p_j\) 同時選的要求,如果 \(x_i|x_j\),就要滿足 \(p_i>p_j\)

直接從前往後貪心求出一個上界,從後往前求出一個下界即可。

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

gmoj 8307 劃分

這個題怎麼就做不出來啊,卡在了 dp 了。

我們先考慮把已有的連通塊的點擴充套件,這個可以求出每個相同數的 \(lca\),然後直接往上跳,是均攤 \(O(n)\) 的。

考慮怎麼 dp,我們設 \(f_{x}\) 表示目前劃分連通塊的方案,目前我們是知道這個點的顏色,\(g_x\) 表示我們不知道這個點的顏色的方案數。

考慮如果一個點是有權值的點,那麼 \(g_x=0,f_x=\prod_{y\in son_x}(f_y+g_y)\)

如果一個點沒有權值,那麼每次我們可以合併子樹,\(f_x\leftarrow f_x(f_y+g_y)+g_xf_y,g_x\leftarrow g_x(f_y+g_y)\)

這個代表的就是可能會出現前面的不知道的點,過了一會被欽定顏色了。

瓶頸在求解 \(lca\),時間複雜度 \(O(n\log n)\)

gmoj 8258 lxl題

考慮把 \(x\) 軸分塊,對於每一塊處理。

Last dance

考慮把矩形分成直接跨越一個塊的,和散塊的。

Last dance

對於散塊,我們在那個塊上插入若干條藍線。

Last dance

我們發現其為如下結構

Last dance

我們可以說明,豎線(圖中沒畫出)和藍線的交點總和是 \(O(n\sqrt n)\) 級別的。

我們把每一個藍線離散化(包括詢問的),構成了很多豎線和藍線所構的格子。

我們把每一行,稱之為綠線。

我們考慮把 \(v\) 從大到小排序,每次面對一個散塊,一定是圖中某兩條藍線的中間的部分,直接遍歷這些格子,用並查集快速遍歷,遍歷完說明權值已經確定。

我們發現一個格子可能會有整塊已經覆蓋了,所以當我們遇到一個整塊,也對每一行維護並查集,遍歷這些綠線,遍歷完表示權值已經確定。

可以對於每一個種類的格子(同一藍線中間),維護幾個變數,以助於更新上述資訊。

對於查詢散塊,我們直接查詢一個 \(n\times \sqrt n\) 的矩陣的二維字首和;對於查詢整塊,我們直接用之前的綠線權值的做一遍字首和。

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

坑:

  • 要注意散塊和整塊要互相轉移,可能是這麼說。
  • 要開 long long

卡常技巧:

  • 感覺線就很抽象,可以直接把兩條線中間的部分分別建出來,實際上可以表示為左閉右開的區間,然後這樣子就不會帶有 2 倍常數了。
  • vector 不要開 \(n\sqrt n\) 的空間,可以直接掃一遍 \(1\to n\) 看是否有交。
  • \(B\) 大概取 \(0.4\sqrt n\)
  • 並查集和二維的權值陣列直接開即可,不要開 vector

ARC185

ARC117E Zero-Sum Ranges 2

ARC113F Social Distance

AGC050B Three Coins

01 Inversion Expected

ABC376

以後細節題把思路簡單寫一下,不要直接寫,儘量找比較好寫的思路。

如果剛開始沒想到不要急,還是仔細想想性質和一些套路。

AGC023F 01 on Tree

10.21

聯考一。

今天這場 T1 是大討論題,以後寫之前還是儘量寫一下思路,並且手摸幾個小一點的樣例,今天還是浪費了很多時間。

要仔細分析性質,然後部分分要想著如何擴充到正解

書店

直接考慮建圖,顯然如果存在偶環一定有解,但是,如果是 \(>1\) 個奇環,一定可以把兩個環中間拉一條鏈,寫就完了。

卡薩內

注意 \(k=3\) 就是二維數點,想正解也要二維數點。

於是考慮把 \(k\) 分奇偶數討論,然後把原問題拆成兩個限制,只要滿足最後連邊是連通塊限制就是正確的,可以發現就是二維數點。

澱粉

首先我們假設已經構成了 \(r\) 的每一個兒子子樹的森林,考慮如果 \(T_2\) 的根 \(r\),跟某個子樹中的一個點在 \(T_1\) 上有邊,那麼顯然就連起來了,所以答案就是沒有這樣的子樹的個數。於是可以換根 dp。

服了

我們考慮分治,每次合併兩個區間的 \(1\) 的個數和字首最大和。

發現現在的問題就是如何取 \(\max\),我們注意到,假設我們要求 \(u,v\) 的最大值,只需要求出 \(u+2^{o}-v\),然後取出 \(o\) 這一位即可。

於是就做完了,剩下的就是程式實現的問題。

假設我們得到了 0000...01(或者是 0000...00)。

那麼先左移若干位,1000...00(或者是 0000...00)。

然後相減,容易得到 1111...10(或者是 0000...00)。設其為 \(x\)

只需要求 \((u\land x)\lor(v\land \lnot x)\)

注意要從 \(2\) 的塊開始合併,否則可能會溢位。

ARC144E GCD of Path Weights

首先扣出那些會被經過的點,剩下的點刪除。

然後我們把點轉成邊,對於每個點建立入點和出點,然後邊權為點權。

我們考慮把單向邊看成雙向邊,反向的邊權為負數。

我們對於每個點定義一個勢能函式 \(w_x\),那麼可以根據邊求出每個點的 \(w\),很顯然,在 \(\bmod ans\) 意義下,我們要求 \(w_1=w_n\)。根據經典結論,一定存在這樣一種定權方式。

而且對於每一個環,我們必須要求這個環的邊權之和為 \(0\)

直接連邊 \(1,n\),構建一個環,然後求出每一個環的總和的 \(\gcd\) 即可。

注意到存在 \(-1\) 的點權,相當於這個圖斷成了很多個森林,直接對於每個森林都做即可,因為這些邊無論選什麼都是可以構造到解的。

類似的套路 CF2023C C+K+S

首先特判兩個圖連完之後不會構成一個新的大強連通分量的情況。

考慮對於每一個環的長度都是 \(k\) 的倍數,這啟示我們一定存在 \(d_1,d_2\) 分別表示這兩個圖的定向情況。且最終圖也滿足這個情況。於是我們只需要對 \(d_1\) 進行若干平移加修正就可以得到 \(d_2\),使用雜湊判斷即可。

ARC082E ConvexScore

注意讀題。

觀察到 \(2^{n-|S|}\),直接考慮組合意義,相當於這些點可以隨意選,那麼題目就轉化為了選擇一些點,問這些點會不會共線,不會共線就合法,直接列舉兩個點,然後計算中間點的個數即可。

ARC141E Sliding Edge on Torus

這個題目考察了並查集的基本功,其實不難想到,是可以放在 NOIP 裡面的。

我們看到這個問題的第一步肯定就是做差,把 \((x,y)\) 看作 \(y-x\) 中的一個元素,於是有 \(n\) 個等價類,現在需要考慮如何合併兩個等價類。

如果我們輸入的兩個位置不在同一個等價類,你就考慮這是一個對應關係,其中對應的關係是 \((c-a)\bmod n\) 這個東西。於是我們考慮使用並查集維護這個對應關係,具體的,設 \(w_i\) 表示 \(i\) 這個點到這個並查集的根的對應關係,根為 \(x\) 的時候這個點為 \((x+w_i)\bmod n\)。我們仔細思考一下,這個東西是可以合併的,如果你要合併的是兩個結點 \(u,v\),找到它們的根結點 \(x,y\),把 \(y\) 合併到 \(x\) 上,設 \(u,v\) 的對應關係為 \(k\),那麼就是 \(k'+w_v-w_u=k\),於是可以解出 \(k'\),可以直接更新 \(w_y\) 的值,然後並查集 find 的時候就可以每次把父親的值累加上來然後再路徑壓縮。

對於答案,我們只需要維護一個答案陣列,顯然兩個位置合併就是答案陣列取 \(\gcd\),注意要與 \(n\) 也取 \(\gcd\)

如果我們輸入的兩個位置在一個等價類裡,我們就考慮把答案與 \(k'\) 也取 \(\gcd\),因為這相當於給 \(x\) 這個點連了一個自環。

10.23

easy game

直接 \(2^{26}\) 比較小。當然也可以用異或雜湊。

Circle&Square

觀察到每次一個點雙直接儘量連成完全圖即可。

未命名 1

注意到答案 \(\leq 3\times 10^{6}\),爆搜出所有合法位置,然後二維數點。

Sereja and Order

貪心好題。

首先注意到可以隨機化,然後沒了。下面講一下正解。

我們先考慮如果存在 \(a_i+b_i\) 同時比 \(\sum a,\sum b\) 都要大,那麼顯然答案是 \(a_i+b_i\)

接下來答案的下界就是 \(\max(\sum a,\sum b)\),下面給出取到這個下界的構造。

首先記 \(L=\max(\sum a,\sum b)\),先新增一個限制 \((L-\sum a,L-\sum b)\)

考慮按 \(a+b\) 從大到小填,分別往左右加,填到一個位置,發現衝突了,此時我們需要調整。

記紅色為填過的部分,綠色為當前這一段,藍色為剩下的部分。

上面分別為 \(s_a,a,e_a\),下面分別為 \(e_b,b,s_b\)

注意到因為我們將 \(a+b\) 排序了,所以 \(b\leq s_a\)\(a\leq s_b\) 至少滿足一個,取出滿足的那個,根據對稱性,取出 \(b\leq s_a\)

如果 \(s_a+s_b+a\ge L\),那麼直接讓下面的綠色和藍色交換位置,是對的。

否則,交換上面的紅色與綠色即可。由於此時有了條件 \(s_a+s_b+a+b\ge L\),所以這樣是合法的。

於是做完了,實際實現的時候可以直接列舉紅綠藍的全排列,直接 check,這樣子不用思考細節。

Largest Smallest Cyclic Shift

給出一個很厲害的做法:先分別看作 \(X,Y,Z\) 個長度為 \(1\) 的字串。每次選擇最小和最大的兩個串,拼接,最後剩下的哪一個串就是答案。

考慮證明正確性,我們先想一下目前有三個串,那麼一定是符合 acb 的。

考慮歸納證明,我們假設已經得到了目前的一個串:\(a_1a_k\cdots a_2\),現在考慮怎麼把 \(a_{k+1}\) 弄進去。

顯然 \(a_k<a_{k+1}\),那麼我們新的串就可以看作是 \(a_1,a_k\cdots a_2,a_{k+1}\),這三個部分,直接拼接就是 \(a_1a_{k+1}a_k\cdots a_2\)

主要是需要感受一下貪心的過程,每次我們之所以要選擇一個最大的串接到後面是因為如果接別的串就會出問題,就不可能是 \(f(T)\),仔細想想為什麼。

ARC073E Ball Coloring

我們注意到,答案一定形如 \((mx-i)(j-mn)\) 或者 \((mx-mn)(i-j)\)

從小到大列舉 \(i\) 的數值,可以用 multiset 維護答案。

事實上,對於第一種情況,可以直接貪心選擇小的進入 \(mn\) 那一邊,反之進入 \(mx\) 那一邊。

10.24

最後一場模擬賽,打得好唐。

後天要冷靜思考,不要急,像今天的四道題目都不難。

youyou 的垃圾桶

直接暴力線段樹二分即可做到 \(O(q\log n)\),注意到答案遞減可以做到 \(O(q+n\log W)\)

坑: 注意要開 long long

youyou 不喜歡夏天

注意到直接對於 \(0,1\)\(1,0\) 看成貢獻為 \(0\) 做,再直接對原問題不考慮 \(m\) 做,減去 \(2m\),兩者取 \(\max\) 是答案。

youyou 的序列 II

特判若干情況,考慮一般來說,我們肯定是找到後手能操作的最左端點和最右端點,如果中間先手可以一步幹掉,就合法,線段樹二分維護。

坑: 注意要開 long long

youyou 的三進位制數

注意到操作是對稱的,於是建圖一定為無向圖,仔細思考可以發現,\(z\) 合法,當且僅當建出圓方樹之後 \(z\)\(x,y\) 的路徑上的點是圓點,直接列舉圓點子樹加統計答案即可。

坑: 一定要注意啊!圓方樹建的時候 \(x\) 的兒子不能到 \(x\),要到兒子 \(y\)(指的是 stack)。

CSP 賽前提醒

注意三個點,策略、心態、細節。

一些注意事項:看一下之前犯過的錯誤,一定不要再犯!

連通圖

首先有做法 1,直接線段樹分治加可撤銷並查集即可。

我們看做法 2,求出原圖的一個生成樹,得到一些樹邊和非樹邊,令第 \(i\) 個非樹邊的權值為 \(2^i\),令這條邊的兩個端點在樹上的對應路徑全部異或 \(2^i\)

定理:

不連通,當且僅當,存在詢問邊的子集異或權值等於 \(0\)

證明考慮兩步:

  • 極小的割一定異或和為 \(0\)
  • 異或和為 \(0\) 的一定為一個割。

首先考慮證明極小的割一定異或和為 \(0\)

證明:

極小割一定把原圖劃分成了 \(S,T\) 兩個點集。

可以說明,對於一個環,我們取出 \(S\) 走到 \(T\) 的邊,這樣的邊一共有偶數條,因為你考慮從一個起點出發,要回到這個點,就必須走偶數次這樣跨越集合的邊。

然後我們考慮證明異或和為 \(0\) 的一定為一個割。

證明:

異或和為 \(0\) 說明,每條沒被割的非樹邊,都經過被割的樹邊偶數次,這個是顯然的,因為這樣子才能保證異或和為 \(0\)

然後我們考慮把沒被割的樹邊縮在一起,形成若干個大點,然後再使用被割的非樹邊相連,由於上面所述,則沒被割的非樹邊所連的兩個大點的深度奇偶性一定相同,由此,深度偶數的大點就一定不會與深度為奇數的大點相連,於是原圖不連通。

該邊即為割集。

由此,我們直接隨機權值,然後跑線性基即可。

時間複雜度 \(O(qk\log W)\)

事實上,這就是 ix35 論文中所說的切邊等價、割線性空間等東西,有時間了好好看一下。

AGC008D K-th K

每個數相當於有兩個限制。

考慮每次填最近的有限制的數即可,你直接從前往後做一遍,從後往前做一遍即可。

時間複雜度 \(O(n^2)\)

相關文章