原创 [dsu on tree] Codeforces #600E. Lomsat gelral

所謂dsu on tree,就是樹上的啓發式合併,處理出重兒子然後搞就行了。樹的特殊性會使寫起來比數據結構啓發式合併方便一點。只需維護一個數據結構,支持插入刪除單個元素。 這題就是模板題啦… #include<cstdio> #

原创 [Johnson + 桶維護DIJ ] Codeforces #843D. Dynamic Shortest Path

這題用到了 Johnson 算法的思想,就是先一趟最短路刷出 dis(i) 然後把圖改造。邊 (x,y) 的權改爲 w(x,y)+dis(x)−dis(y) 。 這樣搞之後,邊權都非負,再新圖上做最短路的事情與原圖是完全等

原创 [雜題] Codeforces #598B. Queries on a String

簡單題。直接考慮原來的某個位置的元素最後到了哪裏….O(nm) #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const i

原创 [虛樹 + DP] BZOJ2286: [Sdoi2011]消耗戰

虛樹入門題。 所謂虛樹就是隻保留需要的關鍵節點及互相的lca進行重建樹,在虛樹上跑DP之類的,使得複雜度與關鍵點個數相關,而且可能能簡化問題。 虛樹的建法是按dfs序的順序加入,維護一個當前鏈的棧,類似dfs一樣搞搞就好了。網

原创 [分治FFT] HDU5730 Shell Necklace

分治 FFTFFT ,就是 CDQCDQ 分治加 FFTFFT 。 用來解決這樣的問題:已知 g(x)g(x) ,且 f(i)=∑i=0n−1f(i)g(n−i)f(i)=∑i=0n−1f(i)g(n−i) 求 f(x)f

原创 [數論雜題] BZOJ1951: [Sdoi2010]古代豬文

爲了數論而數論的題…..沒什麼技術含量… 就是求: G∑i|n(ni)%P=G(∑i|n(ni)%ϕ(P))%P 現在需要求 (∑i|n(ni))%M ,其中 M=ϕ(P)=P−1=999911658=2∗3∗4679∗35

原创 [WQS二分] BZOJ2654:tree

以前做這題的時候以爲只是個神奇的二分,沒有完全懂原理,現在發現實際上就是 WQS 二分。 考慮 g(x) 表示選共 x 條白邊的最優解,可以感覺到這個 g(x) 應是上凸的,滿足斜率不降。所以就 WQS 二分就好了。

原创 [矩陣乘法] BZOJ2326: [HNOI2011]數學作業

我們一個一個接上,應該是 res=res∗10t(i)+i 這樣的形式,其中t(i) 表示 i 的位數。 怎麼樣快速算呢,看成遞推式:f(i)=f(i−1)∗10t(i)+i 。顯然可以用矩乘加速。位數相同的一起搞就行了

原创 [樹鏈剖分+李超線段樹] BZOJ4515: [Sdoi2016]遊戲

先進行轉化,把路徑分成兩條鏈,a(deps−depi)+b=(−a)∗depi+a∗deps+b …類似這樣變形一下,就轉化成和 k∗depi+b 的形式。depi 是遞增的,所以可以看做是一次函數 y=kx+b 在某些離散

原创 [矩陣乘法] LOJ#2002. 「SDOI2017」序列計數

注意到 p 很小,容易想到矩乘。fi→f(i+j)%P 。 關於那個質數的限制,只需要 1 到 m 的方案 減去 1 到 m 扣去所有質數的方案即可。 構造 1 到 m 轉移矩陣 O(P2) 搞,∑mk=1[k%

原创 [雜題 計數 圖論] Codeforces 51E. Pentagon

挺煩的題…..很容易wa… 總之就是求出 Bi,j 表示 i 到 j ,走兩步的方案,Ci,j 表示走三步。 然後 ∑Bi,j∗Ci,j 。然後會有不合法的和重複的… 不合法的大概是 一個三角形多出一個腳…或者就是一

原创 [SG函數 + 分塊] BZOJ4035: [HAOI2015]數組遊戲

博弈好題。這種博弈的01取反的模型可以把白色看做有奇數個石子,黑色看做偶數個,因爲同一位置偶數個石子SG值異或會抵消….. 這麼理解的話,可以把一個石子,即一個白塊看做一個獨立的遊戲。 現在只需求SG值。 SG(i)=mex

原创 [SG函數] BZOJ1188: [HNOI2007]分裂遊戲

可以發現,一顆石子可以看作是一個獨立的遊戲。 n 很小,瞎暴力求 SG 函數就好啦。 #include<cstdio> #include<algorithm> using namespace std; const int m

原创 [錯排] BZOJ2034:「SDOI2016」排列計數

大水題。 主要是記一下錯排的公式。順便水一水 遞推公式:fi=(i−1)(fi+fi−1) 推導過程大概是,考慮數字i , 它有 i−1 種可能的位置,設 i 在位置 k ,則數字 k 可能放在 位置 i 或不放在

原创 WQS二分——學習筆記

http://www.doc88.com/p-949564862405.html http://codeforces.com/blog/entry/49691 我的理解 (不一定很對): 大概就是某個東西越多總貢獻越大,要求