2017集訓隊作業


感覺剩下的都是喪病題了啊,棄坑。。

現已完成: [144/156]

149

自己計數水平還是菜啊,高老師老早就妙掉的題,我看了那么久題解才會做
這題正着dp也能做,但是式子比較煩,考慮倒着dp
\(dp(i,\ x)\)表示還需要連\(i\)條邊使得整個圖聯通,當前在點\(x\)上,推出dp式子之后發現每次都是消同一個矩陣,那么把矩陣的逆求出來就好嘍。。。
考慮如何計算\(i\)個點\(j\)條邊的連通圖數\(P(i,\ j)\)
直接dp需要\(O(n^6)\),考慮容斥
枚舉一個圖的一個划分,不同划分之間不能有邊,則有
\(P(i,\ j)\ =\ \sum_{G}\ [V(G)\ =\ i][E(G)\ =\ j]\ \cdot (-1)^{C(G)\ -\ 1\ }\cdot (C(G)\ -\ 1)!\)
其中\(C(G)\)為圖\(G\)算入\(P(i,\ j)\)的划分成的塊數
我們令\(F(i,\ j)\)表示每個划分的塊都必須要是完全圖的\(P\)的值,最后算\(P\)的時候可以通過在完全圖里隨便選一些邊來做
\(F(i,\ j)\)的時候有個\((C(G)\ -\ 1)!\)比較難處理,如果再開一維\(C(G)\)復雜度就會多一個\(n\),考慮\((C(G)\ -\ 1)!\)的意義
如果沒有\((C(G)\ -\ 1)!\)的話,\(F(i,\ j)\ =\ \binom{M(i)\ }{j}\ -\ \sum_{k\ =\ 1}^{i\ -\ 1}\ F(i\ -\ k,\ j\ -\ M(k))\cdot\ \binom{i\ -\ 1\ }{k\ -\ 1\ }\),其中\(M(k)\)\(k\)個點的完全圖的邊數
每次要枚舉新加入的那個划分的塊,為了避免重復計數,保證每次都把包含\(1\)號點的划分塊當成新加入的塊
那么如果每次把任意一個划分的不包含\(1\)號點的塊當成新加入的塊,就正好乘了一個\((C(G)\ -\ 1)!\)

112

照着題解寫了一遍,還是挺妙的
主要的變換是發現取球的順序是可以交換考慮的,然后就是推一些式子

121

137

123

zzq's 方法: 給樹邊標號的時候先對重邊標號,之后對於輕邊按照相同的dfs順序(先遍歷重兒子)進行遍歷,遍歷到\(u\)節點的時候將所有\(u\)向下連的邊標號,這樣就可以處理對所有兒子修改的操作了

109

這題正解好無聊啊。。。就是無腦討論題qaq
不過離線維護一般圖橋邊數還是挺有趣的,算法參見題解,就不多說啦>_<

108

看到平方就要拆開
有個結論:一個\(n\)個點\(m\)個條邊的無向連通圖按照題目構出的矩陣的秩為\(n\ -\ 1\)
可以這樣理解:by zjt

124

__debug題解
在優化式子的時候如果直接推\(\Pi_{i\ = 1}^N\ \Pi_{j\ =\ 1}^{a_i}\ (a_i\ +\ b_j\ -\ i\ -\ j\ +\ 1)\)的話,算\(x\ =\ a_i\ +\ b_j\ -\ i\ -\ j\ +\ 1\)的個數時可以發現當\(j\ >\ a_i\)的時候\(x\ <\ 0\), 所以直接將\(x\ >\ 0\)的貢獻算入ans即可

136

高老師的題真的非常牛逼啊,樹上的方程可以通過從葉子開始消元成\(dp_u\ =\ k_u\ \cdot\ dp_{par_u}\ +\ b_u\)的形式

120

多項式板子大全(ps.在模形如\(2^k\ \cdot\ a\ +\ 1\)的質數且有原根的意義下,多項式開根只支持常數項為1)
如果在使用過程中出鍋了請聯系我
如果數據范圍過大,可能new int的時候會RE,把new int改成static int即可
本代碼常數較大,可能會被卡常

144

將等差數列寫成\(kx\ +\ b\)的形式,當成多項式處理
次數為\(n\)的多項式,求\(q\)個點的值的復雜度為\(O(qlog^2q\ +\ nlognlogq)\)

155

看到題面里的那種幾個和為\(m\)的數乘起來,然后再乘上\(\frac{1}{i!}\)的形式應該想到\(e^{A(x)}\)
如果系數是\(\frac{1}{(i\ -\ C)!}\)的話可以用\(A(x)^C\ \cdot\ e^{A(x)}\)

133, 146

三方log的解法也是非常妙的,也就是題解里的算法三,雖然A不掉,但是非常有啟發性
對於任意函數\(n\)次差分后,\(\Delta^n\ f(x)\ =\ \sum_{i\ =\ 0}^n\ (-1)^{n\ -\ i}\ \binom{n}{i}\ f(x\ +\ i)\)
對於無法求點值的情況(多項式次數太高),要求\(n\)次差分的時候,\(f(x)\ =\ \sum_i\ a_i\ x^i\)不太好做,轉化成\(f(x)\ =\ \sum_i\ b_i\ \binom{x}{i}\)就比較好差了
因為有\(\Delta^n\ f(x)\ =\ \sum_{i\ =\ 0}^d\ c_i\ \binom{x}{i\ -\ n}\)其中\(f(x)\ =\ \sum_{i\ =\ 0}^d\ c_i\ \binom{x}{i}\)
轉化的時候可以用\(x^n\ =\ \sum_{k\ =\ 0}^n\ S2(n,\ k)\ (x)_k\),其中\(S2(n,\ k)\)為第二類斯特林數,\((x)_k\)表示\(x\)\(k\)次falling factorial
也有\((x)_n\ =\ \sum_{k\ =\ 0}^n\ S1(n,\ k)\ x^k\),其中\(S1(n,\ k)\)為帶符號的第一類斯特林數

129

zzq題解
看了官方題解,感覺挺牛逼的啊,形如\(T(i,\ j)\ =\ \binom{i\ -\ 1\ }{j\ -\ 1\ }\cdot i\)這玩意兒是一個叫萊布尼茲調和三角形的玩意兒的倒數,萊布尼茲調和三角形有一個性質是\(A(i,\ j)\ =\ A(i\ +\ 1,\ j)\ +\ A(i\ +\ 1,\ j\ +\ 1)\),所以運用gcd的性質問題就變成了求\(lcm(N\ -\ K\ +\ 1,\ N\ -\ K\ +\ 2,\ ...,\ N)\),構造一個二維數組來維護\(\frac{ans_{n,\ k\ +\ 1}}{ans_{n,\ k}}\)

119

ARC062F

對於一個\(m\ >\ n\)的聯通無向圖,如果僅通過對一個簡單環的邊進行輪換,可以得到整個圖所有的邊的所有置換結果,證明可以考慮如何交換相鄰兩條邊
要復習一波點雙和polya
求點雙可以在dfs(u)初始的時候stk[top++] = u
對於u的每一個dfs樹中的孩子v判斷是否low[v] >= dfn[u],如果是,就取出點雙
取點雙一定要注意是取到stk[top] == v為止,否則會wa
譬如如下的反例
1 2
2 3
3 4
4 1
2 5
5 6
6 2
以1為根,dfs(2)時,假設先訪問3

110

sxbk卡常題啊, 直接求\(x^N\)TLE求\(x^{N\ mod\ \phi(M)}\)就A了
楊主力教了我一種用一個矩陣來維護每個表達式的方法,感覺非常牛逼啊

147

學了一波surreal number
在一般的博弈論題中都可以用: ${x\ |\ y}\ =\ z,\ x\ <\ z\ <\ y,\ \(且\)z$為最早出現的
然后發現題目出鍋qaq,於是照着題解打了一遍,發現NOI2017D1T1都不會做,自己afo后水平下滑的太快,要是現在去考noi一道題都A不掉
感覺surreal number還是挺有趣的,以后可以學一學,打算把Knuth的小說給讀了

ARC066F

非常巧妙的分治
考慮枚舉選\(P_i\)的左端\(x\)和右端\(y\), 考慮分治做當\(l\ \leq\ x\ \leq\ y\ \leq\ r\)的時候的最大值

ARC083F

dag的拓撲排序數沒有多項式時間做法

142

計算\([l,\ r]\)\(x\)的lca可以考慮將\([l,\ r]\)的點到根經過的邊次數\(+1\),答案為\(x\)到根經過的每條邊的次數*邊權之和

106

\(ln(1\ -\ A(x))\ =\ \int\ \frac{-A'(x)}{1\ -\ A(x)}\ dx\ =\ -\int\ (\sum_{i\ \geq\ 0}\ A(x)^i)\ dA(x)\ =\ -\sum_{i\ \geq\ 1}\ \frac{A(x)^i}{i}\)
第二步可由\(\int\ f[g(x)]g'(x)dx\ =\ \int\ f[g(x)]dg(x)\)推導

105

第一次用向量乘優化矩陣乘法的技巧
注意可能會乘爆,所以要設\(\infty\)

139

結論猜不出啊qaq,圖論題以后可以練一練

117

樹上最長可以考慮成直徑,點分之后相當於在新的虛樹上的直徑
只有加點的動態維護只需要維護直徑兩端就行了

154

簡單數據結構題自己卻不會做,好菜啊
對於二進制下做加法,可以建trie
如果根的左右兒子表示最高位,復雜度爆炸
表示最低位就只有\(O(\log\ val)\)
寫trie或者其他數據結構的時候如果每次直接用node *u = new node會T,可以參考myy的代碼,用一個pool存儲

135

那么多人過的題,就我不會,水平墊底啊
觀察\(F\)的性質可以發現如果知道了\(F(2i),\ F(2i\ +\ 1)\)可以推出\(F(i),\ F(i\ +\ 1)\),如果知道了\(F(2i\ -\ 1),\ F(2i)\)可以推出\(F(i\ -\ 1),\ F(i)\),那么枚舉\(F(m\ -\ 1)\)即可

107

152

ARC081F

求一個矩陣最大全0子矩陣的方法是對每個點找到左側和右側都不低於它的最遠位置,這種做法非常的妙

145

125

可以推出
\(ans\ =\ \sum_{d\ =\ 1}^N\ (2d\cdot f(\left \lfloor \frac{N}{d} \right \rfloor)\ +\ d\cdot \left \lfloor \frac{N}{d} \right \rfloor)\)
\(f(M)\ =\ \sum_{a\ =\ 1}^M\ \mu(d)\cdot d\cdot g(\left \lfloor \frac{M}{d^2} \right \rfloor)\)
\(g(T)\ =\ \sum_{a\ =\ 1}^{\sqrt{T}}\ a\ \sum_{b\ =\ 1}^{\sqrt{T}}\ \left \lfloor \frac{T}{a^2\ +\ b^2} \right \rfloor\)
這個時候發現\(\left \lfloor \frac{T}{a^2\ +\ b^2} \right \rfloor\)不太好處理,有個技巧是枚舉\(k\ =\ a^2\ +\ b^2\)來做,將下取整拆成\(\sum_{k}\ 1\),有
\(g(T)\ =\ \sum_{k\ =\ 1}^T\ h(\left \lfloor \frac{T}{k} \right \rfloor)\)
\(h(S)\ =\ \sum_{a\ =\ 1}^{\sqrt{S}}\ a\ \sum_{b\ =\ 1}^{\sqrt{S}}\ [(a^2\ +\ b^2)\ \leq\ S]\ =\ \sum_{a\ =\ 1}^{\sqrt{S}}\ a\cdot \left \lfloor \sqrt{S\ -\ a^2} \right \rfloor\)
這樣做可以拿到85分,復雜度\(O(n^{\frac{3}{4}})\)

可以發現不管怎么卷,卷多少次,\(f,\ g,\ h\)都有\(O(\sqrt{N})\)個值需要計算,所以復雜度均為\(O(\int_{1}^{\sqrt{N}}\ \sqrt{\left\lfloor\frac{N}{i}\right\rfloor})\ =\ O(\sqrt{N}\cdot i^{\frac{1}{2}}\vert_{1}^{\sqrt{N}})\ =\ O(N^{\frac{3}{4}})\)

主要復雜度在\(g\)上,考慮預處理\(g\)
\(h\)差分,令\(l(N)\ =\ h(N)\ -\ h(N\ -\ 1)\ =\ \sum_{a\ \geq\ 1}^{\sqrt{N}}\ a\cdot [(\left \lfloor \sqrt{N\ -\ a^2} \right \rfloor)^2\ +\ a^2\ =\ N^2]\)
則有\(g(N)\ =\ \sum_{i\ =\ 1}^N\ h(i)\cdot \left \lfloor \frac{N}{i} \right \rfloor\)
再對\(g\)差分,有\(g(N)\ -\ g(N\ -\ 1)\ =\ \sum_{d\ |\ N}\ l(d)\),就可以A掉了
由於這題有多個函數需要計算,因此需要能計算出每個函數大致需要的運算次數,去優化超過時限的函數的計算
在推倒中重復運用了差分和將下取整拆開的技巧

131

126

prufer編碼后推出一個\(O(n^3)\)的dp式子
題解是拆開后分析每一個形如\(a_1\cdot a_2\cdot a_4\)的項的系數求和,用了這個式子,也可以強上GF

127

對於齊次線性遞推\(h_n\ =\ \sum_{i\ =\ 1}^{k}\ a_i\cdot h_{n\ -\ i},\ a_k\ \neq\ 0\ \ \ (n\ \geq\ k)\),另\(q_1,\ q_2,\ q_3,\ ...,\ q_t\)為特征方程互異的根(特征方程為\(x^k\ -\ \sum_{i\ =\ 1}^k\ a_i\cdot x^{k\ -\ i}\ =\ 0\)),如果\(q_i\)\(s_i\)重根(重根的定義為有\(s_i\)個根為\(q_i\)),則另\(H_n^{(i)}\ =\ \sum_{j\ =\ 1}^{s_i}\ c_j\cdot n^{j\ -\ 1}\cdot q_i^n\),有\(h_n\ =\ \sum_{i\ =\ 1}^t\ H_n^{(i)}\)\(c_1,\ c_2,\ c_3,\ ...,\ c_n\)為需要求解的系數

114

一開始寫用三模數ntt的時候傻逼了,CRT不能按照正常的方法做,而是要列方程解,因為模數不是選的三模數的乘積
對於任意模數fft通過myyfft比較快,寫了個板子,以后可以用
在預處理\(\omega\)的時候注意要用\(cos(i\cdot \pi\ /\ hl)\),而不是一直從\(1\)每次成\(wn\),否則精度會炸

153

115

加0之后就要強行杜教篩,有毒吧...

128

需要復習一下線代相關的知識

148

發現當\(F(n)\ \neq\ n\)當且僅當\(n\)含有\(2,\ 3,\ 5,\ 7,\ 11\)中的質因數,直接dp即可
題解做法是設一個\(G(n)\ =\ \sum_{d\ |\ n}\ F(d)\cdot\mu (\frac{n}{d})\)
感覺自己根本不會數論啊,太菜了

140

有兩種做法
做法一:
一個三個點的二叉樹,一定要把根換到最小,那么對於6種大小關系(1表示最小、3表示最大):123->123,132->132,213->123,312->132,231->123或132,321->123或132。由於最后兩種情況變出的兩種情況都有可能是最有解的一部分,所以都要考慮,那么可以dpi,j,k表示第i個點的子樹,如果根是j,下面為原樣,最佳的方案中第k個數字是多少,每次dp直接暴力枚舉轉移並合並。可以證明這樣是O(nlog2n)的:假設一共有k層,那么求和就是\(O(\sum_{i\ =\ 0}^k\ 2^i\ \times\ i\ \times\ 2^{k\ -\ i})\ =\ O(2^k\ \times\ k^2)\ =\ O(nlog_2n)\)
做法二:
考慮直接進行模擬,建一個數據結構維護有哪些邊已經強制被選擇,具體見代碼吧

130

134

正解杜教篩,結果強上洲鴿篩被卡了一天的常才過qaq還有4k代碼長度限制,真的sxbk
說一說洲鴿篩的一下卡常方法吧:
一些指針優化、去if和寄存器的方法就不說了。。。那個應該陶神最擅長啊orz
除法非常慢,盡可能的把除法刪去,一個技巧是在枚舉\([1,\ \sqrt{N}]\)的時候,\(/p_i\)的值可以通過暴力枚舉
在算第二部分的dp值的時候暴力的做要枚舉每一個\(\leq\ j\)\(p_i^c\),跑的時間大概是第一部分的三四倍,考慮優化掉這一部分
可以發現
\(dp(i,\ j)\ =\ dp(i\ +\ 1,\ j)\ +\ \sum_{c\ \geq\ 1}\ dp(i\ +\ 1,\ \left \lfloor \frac{j}{p_i^c} \right \rfloor)\cdot F(p_i^c)\)
\(dp(i,\ \left \lfloor \frac{j}{p_i} \right \rfloor)\ =\ \sum_{c\ \geq\ 1}\ dp(i\ +\ 1,\ \left \lfloor \frac{j}{p_i^c} \right \rfloor)\cdot F(p_i^{c\ -\ 1})\)
所以可得
\(dp(i,\ j)\ =\ dp(i\ +\ 1,\ j)\ +\ 2dp(i,\ \left \lfloor \frac{j}{p_i} \right \rfloor))\ -\ dp(i,\ \left \lfloor \frac{j}{p_i^2} \right \rfloor)\ +\ dp(i\ +\ 1,\ \left \lfloor \frac{j}{p_i} \right \rfloor)\)
這樣可以多過一個點,還有兩個點需要-1s超1s
因為還是做了2次除法
可以在算\(dp(i,\ j)\)的時候直接先將\(2dp(i,\ j)\ -\ dp(i\ +\ 1,\ j)\)算出
最后好像跑的比一些杜教篩快

正解里先簡化\(\sigma0(n^2)\),然后變成要求\(\sum_{i\ =\ 1}^N\ \mu(i)^2\),這玩意兒可以理解為\([1,\ N]\)中的不含完全平方數為因子的數的個數,再通過意義轉化

132

AGC015E

AGC008F

將每個可以產生的樹,用直徑的中心來表示,這個技巧在許多樹計數問題都可以用,選重心用於子樹大小相關,選中心經常用於直徑相關

AGC011F

首先需要用數學式子來表示條件,表示的時候可以有個技巧,將第二輛火車的到達時間設為0
之后可得
\((A\ +\ x\ +\ a_i)\ mod\ L\ \leq\ (B\ -\ y\ -\ a_i)\ mod\ L\)
\((A\ +\ x)\ mod\ L\ \geq\ (B\ -\ y)\ mod\ L\)
移項后將\(x\)\(y\)放在一起
就變成了\(x\ +\ y\ \in\ [L,\ R]\)
這個通過貪心即可實現

AGC004E

AGC005E

AGC003F

AGC003E

答案就是\(i\ mod\ q_0,\ q_1,\ ...,\ q_m\)之后的和,一定要用multiset
一開始又想錯了,wa了一發,還是應該think twice啊

AGC001D

AGC003D

題解有一個不用polard rho求將一個數補成完全立方數的算法。枚舉\(\leq\ 1000\)的質數,\(>\ 1000\)的分類討論即可。

AGC001E

一開始總是在想如何計算\(F(X,\ Y)\)(A的和為X, B的和為Y)的方案數,但是應該沒有比fwt更優的做法了吧
題解是將最后的式子\(\sum_{i\ =\ 1}^n\ \sum_{j\ =\ 1}^n\ \binom{A_i\ +\ A_j\ +\ B_i\ +\ B_j}{A_i\ +\ A_j}\)的二項式系數在平面上表示,意義就是從\((-A_i,\ -B_i)\)\((A_j, B_j)\)的路徑數

AGC019C

AGC017E

ARC082C

AGC017D

對於樹上一些游戲的題目,可以考慮對於一個點,可以將它拆成每個子樹的一個子游戲,這個點的游戲結果相當於所有子樹的游戲結果的\(xor\)
如果只有一條邊,可以通過數學歸納法證明
自己應該多練一練博弈論啊

ARC082D

AGC019F

打個表可以找到規律。。。這種方法就不多說了qaq
翻譯一下tourist的題解吧:
首先可以將這種比較簡單的dp轉移變成每個點有權值,答案求從s到t點的路徑期望數
發現對於一條\(i\ +\ j\)相同的對角線上,經過對角線所有點的總路徑數就是s到t的總路徑數,並且分母相同,所以按這種順序考慮遞推計算
如果相鄰的兩個點分子差為1,那么就需要統計經過這兩個點邊的路徑數加到答案里去,這部分也可以通過按整條對角線遞推計算

AGC010E

ARC072D

將每天放完水之后的dp值考慮上凸殼

ARC083C

AGC005D

AGC007C

自己根本不會概率和期望。
通過期望的線性性將答案拆成每一段上每個球滾過的概率,將dp式子寫出來之后打表可以找到規律。
題解是每次模擬推一個球,計算之后每一步的期望。
這里講一下余神犇教我的解法:
\(f_{l,\ r}\)表示一個線段,左側是坑,右側是球,左側有\(l\)個球,右側有\(r\)個球經過這個線段的期望球數
可以得到\(f_{l,\ r}\ =\ \frac{1}{2(l\ +\ r)}\ (2l\ *\ f_{l\ -\ 1,\ r}\ +\ (2r\ -\ 1)\ *\ f_{l,\ r\ -\ 1}\ +\ f_{r\ -\ 1,\ l}\ +\ 1)\)
這個沒法優化,但是考慮答案要求的是\(\sum_{l\ +\ r\ =\ n}\ f_{l,\ r}\ *\ A\),其中可以發現對於\(f_{l,\ r}\)\(f_{r,\ l}\)\(A\)的和一定
所以可以通過沿對角線掃的方式來求答案

AGC007F

ARC071D

AGC010F

ARC077C

AGC010D

直接考慮原問題較為復雜,先分析奇偶性。
如果奇數個數\(>1\),那么每次操作之后奇偶性只有\(-1\)的數變。這時如果沒有偶數,先手必敗。
如果奇數個數\(=1\)要進行特判。

AGC011D

ARC065D

在看別人ac代碼的時候發現了一個逼格挺高的一個取模寫法, 感覺可以把妹子用啊

int F(int x) {
    return x -= mod, x + (x >> 31 & mod);
}

實測效率並沒有提高多少
正確的原因是\(x >> 31\)高位用符號位補齊, 感覺初賽要gg啊

AGC016F

第一次做dp of dp,感覺真的是很有趣啊
首先可以發現\(sg(u,\ v)\ =\ sg(u)\ xor\ sg(v)\),然后問題就變成了求有多少個圖\(sg(1)\ \neq\ sg(2)\)
這個時候可以通過sg值的定義來dp, 對於sg值為\(x\)的點,必須要與sg值為\(i\ (i\ \subseteq\ [0,\ x\ -\ 1])\)的集合中的至少一個點有邊相連.
如果從\(n\)\(1\)定sg值的話,比較難dp
按照sg值大小進行dp即可

AGC016E

一開始總是想如果令i活下來的話,那么和i相鄰的都會定下來,寫dfs,但是遇到了一些比較難處理的問題。
比較優秀的處理方法是直接倒着沿\(m\)掃一遍,掃出來的都是必須要活着的,如果\(i\)\(j\)掃出來要活着的集合並為空,即為可行方案。
以前也遇到一些兩維的題目,經常是沿着一維考慮非常難,換一維思考就比較簡單,感覺這種題目還是要練啊。
高老師好像這類題目非常niubi, 經常做出來,實在是太勁了orz

AGC016B

AGC016C

AGC004D

AGC006C

\(x_i\)改為\(x_{i+1}\ +\ x_{i-1}\ -\ x_i\)時可以考慮差分

AGC014E

挺妙的一個題。一開始一直考慮如何維護出現兩次的邊,總在想一些高級數據結構。將操作從后往前考慮之后,可以發現如果合並兩個點,那么直接啟發式合並,把新出現的邊扔一個隊列里就行了,因為出現兩次重復的邊一定有新加的。

AGC012D

AGC012C

ARC063C

AGC007E

對於要維護最短直徑的題目,可以先二分,這樣可以省去維護內部最長長度的一維

AGC010C

AGC005F

考慮容斥完之后的式子\(f(k)\ =\ \sum_{u\ =\ 1}^n\ (\binom{n}{k}\ -\ \sum_{i\ =\ 1}^m\ \binom{size_i}{k})\ =\ \frac{1}{k!}(n\ \frac{n!}{(n\ -\ k)!}\ -\ \sum_{i\ =\ 1}^m\ \frac{a_i!}{(a_i\ -\ k)!})\), 就可以fft了,如果直接fft要注意要把數字控制在32768以內

AGC013C

AGC002F

將每種顏色第二個球按順序確定之后,會有一些a在b后的限制條件,就考慮建出一個圖求拓撲排序數

ARC073C

AGC015F

發現如果將詢問Q(A, B)變成Q(B, B), 那么答案只有log級別, 所以先預處理出所有形如Q(A, A)的答案, 然后就直接暴力枚舉下一步即可

ARC074C

AGC002E

我是直接用優化\(dp[i][k]\)表示,從小到大排序后,剩下\(a[1...i]\)沒有被第一種操作刪過,已經進行了\(k\)次第二種操作的勝負性
題解是把直接畫出圖之后把每次操作當成向上或者向右走,感覺差不多orz

AGC009D

感覺題解根本想不到啊qaq, 這種類似點分的問題要想到將所有點標號, 兩個值相同的點路徑中存在大於它們的點。然后考慮記錄dp[u], u為根的子樹內部仍然沒有被消掉的點的mask, 可以發現這個mask是越小越好的,所以直接dp就行了orz

ARC072C

由於和終點距離單調不增,所以維護\([i...n]\)最小的不能達到的值即可

ARC068C

AGC006F

ARC077D

AGC004C

ARC080C

ARC002D

AGC009E

挺好玩的一個題,把merge過程想成在一棵樹上進行合並,如果所有點的值都乘\(k^{dep}\), 那么構成的數就是所有填的地方的和。但是這樣很難去重,所以考慮如果一個點的孩子填的都是同樣的一個值(1或者0), 那么就把這個點填1, 刪掉兒子, 這樣一來,令\(o[1], o[2], ..., o[dep]\)為每層填的1的個數,發現是一個k進制數,顯然就沒有重復了。合法當且僅當最深一層兩數之和為\(k\), 其余和均為\(k\ -\ 1\)。直接dp即可。這種題目都能先re一遍,感覺代碼能力非常差啊qaq

AGC014D

對於博弈論的分析要轉化成一個模型,譬如在此題中可以轉化成匹配

ARC070D

AGC011C

AGC004F

先做了1500,感覺自己真菜。。。考慮問題可以轉化為對於每一個點,記錄在得到解得過程中顏色的變化,把所有點處於白色狀態的作為一個圖,處於黑色狀態的作為另外一個圖,那么合法的方案就是對於每個點白色圖中的\(degree\)是黑色圖中的\(degree+1\), 並且白色圖和黑色圖都可以得到完美匹配。
1500部分
由於是一顆樹,那么是否可以完美匹配可以從葉節點貪心來做。如果想不清楚,實現起來挺復雜的。(至少對於我這種菜雞是這樣的。。。三行dfs寫了2hr寫不出,膜別人代碼才懂qaq
對每個點記錄一個值x, 如果這個點和父節點要在黑色圖中匹配, 返回一個負值, 否則返回一個正的。abs(x)表示要和父節點匹配多少條邊
上一波代碼

int dfs(int u = 1, int p = 0) {
	int x = -1;
	for (int v: g[u]) {
		if(v != p) {
			x += dfs(v, u);
		}
	}
	ans += abs(x);
	return -x;
}

2200部分
由於\(m\ =\ n\), 所以只有一個環(連這個條件都看不到。。。別玩了。。。
如果是二分圖,發現如果給黑色圖中的匹配邊和白色圖中的匹配邊定向的話,問題就轉化成了在左側每個點上有一個棋子,經過一系列移動使得右側每個點上有一個棋子,問最少步數。(感覺題解這個轉化真的很妙啊orz,題解的意思是如果考慮把二分圖一側的顏色反轉,那么每次操作相當於把一條邊左側和右側顏色交換
對於樹中的部分,沒有任何變化,接下來考慮環上的部分
環上每個點都有一個權值\(c[i]\)
如果是偶環,設有\(m\)個點,點\(m\)向點\(1\)連的邊流量為\(x\), 答案就為\(\sum_{i\ =\ 1}^m\left | c[1]\ +\ c[2]\ +\ c[3]\ +\ ...\ +\ c[i]\ +\ x \right |\), 求最小值
如果是奇環,考慮將\((1,\ m)\)邊刪去。那么對於\((1,\ m)\)上的操作相當於給左側和右側同時增或減棋子,這個值可以計算出來,然后就變成了樹上的問題了

ARC064D

AGC009C

ARC078C

AGC006D

ARC065C

傻屌題,居然寫出了這種代碼

for (auto x: ax) {
	sort(ALL(x));
}
for (auto x: ay) {
	sort(ALL(x));
}

AGC015D

AGC011E

\(111...11\)考慮成\(999...99\ /\ 9\ =\ (1000...00\ -\ 1)\ /\ 9\)

ARC078D

ARC068D

AGC018F

一開始想到先把每棵樹所有點的子樹和都變成-1,然后再建網絡流看能不能得到,然后走上了不歸路,感覺沒法用網絡流跑啊。。。
題解真的想不到。如果把所有x的值都確定在[-1,1]中,那么和的abs為1就變成了子樹內x為奇數點需兩兩匹配,直接dfs即可

AGC018C

自己數據結構可真是菜。三維很明顯不好搞,將\((A_i,\ B_i,\ C_i)\)變成\((A_i\ -\ C_i,\ B_i\ -\ C_i,\ 0)\)之后,只有兩維了。
這時候有很多做法:
1.對於\(A_i\ -\ C_i\)排序,這樣之后枚舉\(K\), 前\(K\)個里面選\(X\)\(A\)\(K\ -\ X\)\(B\), 之后的\(N\ -\ K\)個選\(Y\ -\ K\ +\ X\)個B, 前半部分可以邊掃邊用heap維護,后半部分BIT維護即可(看了高老師的blog,發現做法和我差不多,可能是也算是他教我做題?但是自己和他還是有很大的差距啊
2.題解中關於\(A_i\ -\ B_i\)排序,這樣選\(A\)的序號一定比選\(B\)的序號小(可以用貪心證明)
題解做法還是想不到,應該多練練數據結構維護方面的題目啊

AGC018B

一開始總想dp,后來發現如果每次刪最大的才會變優,其實是個貪心。
應該加強貪心訓練

AGC018D

挺喜歡的一個題,畢竟是和樹相關的。
考慮如果將哈密爾頓路變成環,那么答案可以達到\(\sum_{i\ =\ 1}^n\ min(siz[i],\ n\ -\ siz[i])\),現在要刪去環上的一條邊。如果有一條邊兩側子樹大小相等,那么必須刪去這條邊,否則以重心為根dfs,如果割去的那條邊經過點\(u\)\(par[u]\)的邊,那么割去的總代價就為\(u\)\(centroid\)路徑的邊權和。

AGC006E

ARC080D

ARC075D

AGC008E

ARC079D

AGC019E

AGC013E

將平方轉化為放兩個球

AGC015C

ARC074D

AGC008D

AGC017F

ARC073D

AGC009B

ARC069D

AGC019D

AGC013D

ARC066C

ARC063D

AGC018E

注意到\(\sum_{i=0}^n\ \sum_{j=0}^m\ \binom{i+j}{i}\ =\ \binom{n+m+2}{n+1}\ -\ 1\),所以可以通過容斥的方法將問題轉化成給定A和C兩個點,中間有一個矩形B, B中選一個點P,從A到P到C的方案數
之后的部分可以通過類似AGC019F的方法沿\(x\ +\ y\)掃一遍,每次暴力轉移邊界即可
感覺自己推組合式好菜啊,大多數時候還是需要打表qaq

AGC012E

最裸的dp是\(dp[l][r][s]\)表示\([l,\ r]\)區間都遍歷過,並且用了\(s\)集合里的數, 然后發現這樣其實可以通過\(f[i][s]\)\(g[i][s]\)來表示,其中\(f[i][s]\)表示前綴\(i\)個用\(s\)集合里的數能否達成,\(g[i][s]\)表示后綴。由於存儲的變量是bool,並且有單調性,考慮直接用\(f[s]\)表示用\(s\)可以達到的最長前綴,合並即可

AGC016D

用dsu實現更加便捷

AGC005C

ARC076C

ARC076D

ARC067D


免責聲明!

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



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