原创 [BZOJ 2055]80人環遊世界 有上下界網絡流

由於每一個節點都具體規定了人數,所以上下界一樣,然後就像可行流一樣建圖後跑最小費用最大流就好了. #include<cstdio> #include<cstring> #include<iostream> #include<queue>

原创 【BZOJ 3439】Kpm的MC密碼 主席樹+trie樹

所有的串都倒着插然後後綴變前綴,然後用主席樹維護dfs序查詢子樹第k大就好了,唯一就是注意一下肯呢過有重複的串 #include<cstdio> #include<cstring> #include<iostream> #include

原创 【BZOJ 3791】作業 dp

有點意思的dp。 需要明確的就是把每一次的染色當做劃定區間,最後只會最多有2*k-1個區間,就。。。。可以dp了 設f[i][j][p]爲分成i段,前j位最後一個數字爲p的最優值 兩種策略: 1.塗色 f[i][j][p]=max(f[i

原创 [BZOJ 3994][SDOI 2015]約數個數 數學+反演

∑i=1n∑j=1nd(i,j)=∑i=1n∑j=1m⌊ni⌋∗⌊mj⌋,gcd(i,j)=1 主要就是這個公式吧,其他的都是很好寫的莫比烏斯反演,一股腦的推就好了.對於這個式子如果想要看嚴格的證明的話就去看po姐的博客吧,很好

原创 [BZOJ 3720]Gty的妹子樹 樹上分塊

類似於序列上面的分塊,給每一個樹設置一個大小上限,不夠就繼續加,夠了就新建一個塊. 友情提示:把塊寫成一個結構體打包起來,然後數組開大一點,血的教訓 #include<cstdio> #include<cstring> #include<

原创 [BZOJ 2741]【FOTILE模擬賽】L 分塊+可持久trie樹

首先很顯然維護異或前綴和讓詢問區間連續一段變成詢問兩個單點. 然後就比較套路了,發現每一次都是詢問一個區間內而且不滿足我們已知知識內的一些特殊性質例如單調性,但是暴力又可以很容易的做出來,所以這個時候就可以考慮分塊了設f[i][j] 表示

原创 【BZOJ 3594】[Scoi2014]方伯伯的玉米田 樹狀數組

顯然,要拔i,那麼拔i->n一起一定不會更差(後面的相對高度不變,但是比前面的高度高的可能性更大),所以,就變得水水的了。 設f[i][j]爲高度爲i,被拔過j次的最長不下降子序列,然後用二維數組維護 就可以了。 值得一提的是,不要把拔0

原创 [BZOJ 4571][scoi2016]美味 主席樹

從高到低按位貪心,對於原來的數列建立權值主席樹,每一次貪心的算出區間範圍然後主席樹查詢有沒有這個區間有沒有這個值,然後就沒有了 #include<cstdio> #include<cstring> #include<iostream> #

原创 【BZOJ 4103】[Thu Summer Camp 2015]異或運算 可持久化trie樹

矩陣什麼的不用管,就是a給一個區間,b給一個區間兩兩異或第k大,發現b很大a很小,就給b建一個可持久化trie樹,順便記下size以便於查詢第k大。 對於每一次的詢問,外層枚舉位數,內層枚舉A的每一個數,用結構體存下每一個A中的數對應的B

原创 [BZOJ 3772]精神污染 主席樹+dfs序

這題目描述是真...精神污染.. 比較有趣的一道題目,首先顯然ans=所有兩兩之間有包含關係的路徑/所有的方案數 那麼,現在問題就變成了如何快速的找到有包含關係的路徑. 假設現在有路徑A以及路徑B,切A包含於B,那麼顯然A的兩個端點都在B

原创 【BZOJ 2178】圓的面積並 自適應辛普森公式

∫rlf(x)=(r−l)(f(l)+f(r)+4f(mid))6 f(i)是x=i這一條直線經過的被圓覆蓋的長度,然後遞歸求解,如果發現誤差小於1e-13就直接返回 #include<cstdio> #include<cstr

原创 【BZOJ 1977】[BeiJing2010組隊]次小生成樹 Tree

思想簡單,寫起來噁心,還好1A了(逃,多考慮一下就好了 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector>

原创 【BZOJ 2705】[SDOI2012]Longge的問題 歐拉函數

水水的數學題 枚舉gcd所以 ans=∑d*∑gcd(i,n)==d=∑d*∑gcd(i/d,n/d)==1 第二個求個可以顯然發現就是歐拉函數,問題解決 可是。。。由於最近寫數學題全部都是O(n)用積性函數性質來篩歐拉函數。。。結果想了

原创 【BZOJ 2756】[SCOI2012]奇怪的遊戲 網絡流+二分

很有趣的做法。 首先,題目要求每一次的加數都必須加相鄰的兩個格子,這樣我們將棋盤黑白染色就能很顯然的發現每一次的加數都是將一個黑格子和一個白格子加一。 繼續分析:設黑格子的個數爲c1,和爲s1,白格子的個數爲c2,和爲s2,設最後棋盤所有

原创 [BZOJ 2956]模積和 分塊+數學

一開始忘記了平方數列求和,鬱悶: sum[n]=n*(n+1)*(2*n+1)/6 其實打一個表是看得出規律的,但是要進行運算我們還是得把他變成數學公式纔可以啊: 對於取模運算:n%i=n−⌊ni⌋∗i 化簡以後就是喜聞