原创 【bzoj 4975】區間翻轉(博弈論)

傳送門biu~ 考慮序列中順序對的個數。 ① 對於終止態,順序對一定爲0(偶數),此時先手必敗。 ② 對於翻轉的區間[l,r],可以視作將[l,r]內的順序對數和逆序對數調換。 ③ 因爲區間長度爲4x+2或4x+3,帶入可

原创 【bzoj 4516】生成魔咒(後綴自動機)

傳送門biu~ 求本質不同的子串個數,相當於把SAM上的每一個節點表示的長度範圍大小(Max-Min+1)求和。 #include<bits/stdc++.h> using namespace std; int n;long l

原创 【bzoj 5216】公路建設(線段樹+Kruskal)

傳送門biu~ 用線段樹維護使用編號在[l,r]內的道路最終會選擇哪些道路。即線段樹每個節點記錄一個邊的集合,集合大小顯然不超過n。 在合併兩個區間的時候採用Kruskal用歸併的方式合併(暴力)。 #include<bits

原创 【bzoj 5200】Factor-Free Tree(分治+啓發式分裂)

傳送門biu~ 預處理每個點能作爲樹根的區間,即預處理出每一個數左邊和右邊第一個與它不互質的數的位置。可以發現對於一棵子樹,以任一合法的點作爲根都是一定成立的。用【bzoj 4059】Non-boring sequences的啓

原创 【bzoj 4976】寶石鑲嵌(貪心、高位前綴和)

傳送門biu~ 當n-k>=16時,每一位上的1都可以出現,只需要考慮每位是否有1即可。 剩下的情況n最大隻有115(數據範圍瞬間變得友善了)。 令f[state]代表組合出state最少需要多少個數,跑揹包即可。然後再將f

原创 【bzoj 2555】SubString(SAM+LCT)

傳送門biu~ 查詢一個串出現了幾次,即詢問SAM上表示這個串的的Right數組有幾個。當我們向SAM上添加一個節點時,這個節點在parent樹上到根的路徑上的所有節點Right數組數量都會+1。可以用LCT維護。 本來說快省

原创 【bzoj 4423】Bytehattan(平面圖轉對偶圖+並查集)

傳送門biu~ 把網格圖轉成對偶圖,網格圖刪邊相當於在其對偶圖上連邊,如果對偶圖上要連邊的兩個點曾經連過邊,就說明原圖刪邊刪出了個環,即原圖不連通。用並查集維護聯通性。 #include<bits/stdc++.h> using

原创 【bzoj 2563】阿狸和桃子的遊戲(貪心亂搞)

傳送門biu~ 把每條邊的邊權平分給它連的兩個點。因爲最終求的是比分的差值,所以如果兩個點被同一個人選取,那麼這個人就會得到這條邊的邊權;如果被兩個人選取,兩個人的分值作差時會把邊權這部分抵消掉。按大小順序依次選取即可。 #in

原创 【bzoj 5281】Talent Show(分數規劃的揹包dp驗證)

傳送門biu~ #include<bits/stdc++.h> #define N 255 #define maxw 1005 using namespace std; const double eps=1e-6,inf=1e6;

原创 【bzoj 4919】大根堆(set啓發式合併)

傳送門biu~ 假設是在序列上,就變成了nlogn的dp求最長上升子序列問題;假設是在樹上,我們只需要在每個節點存下dp數組,然後用set的啓發式合併將dp數組合並就可以了(代替Splay)。 #include<bits/st

原创 【bzoj 4698】Sandy的卡片(後綴自動機)

傳送門biu~ 把原序列差分,建廣義後綴自動機。再用原序列在SAM上匹配,對於每一個單詞,把這個點到根的所有節點的sum值+1。假如一個點的sum值爲n,那麼說明這個單詞在所有序列中都出現過,用val+1更新答案。爲了避免重複運

原创 【bzoj 1912】patrol 巡邏(樹DP)

傳送門biu~ 在加新路前每條邊需要走兩次,加一條新路(u,v)可以使總距離減小dis(u,v)。所以在k=1時只需求樹的直徑;在k=2時選兩條路的路徑長度和最大,將選擇的兩條路(u1,v1)、(u2,v2)在樹上相交的部分抵消

原创 【bzoj 3926】諸神眷顧的幻想鄉(後綴自動機)

傳送門biu~ 題目中說葉子節點不超過20個,可以以每個葉子爲根建廣義後綴自動機,然後像【bzoj 4516】生成魔咒那樣統計答案即可。 #include<bits/stdc++.h> #define N 100010 usin

原创 【bzoj 5201】Connections(強連通分量)

傳送門biu~ 只要跑一邊Tarjan,記錄選擇了哪些樹邊和返祖邊就好了。因爲對於每個點,所選的與這個點相連的邊的數量不會超過2,所以最終選擇的邊數一定少於2n。最後隨便加邊使邊數到達2n即可。 ps.因爲最後整個圖也一定是強

原创 【bzoj 2073】PRZ(狀壓DP)

傳送門biu~ 把當前過去了哪些人進行狀態壓縮,枚舉當前狀態走的最後一批人來轉移。 #include<bits/stdc++.h> #define inf 0x3f3f3f3f #define lowbit(x) (x&(-x)