本弱逼長期做題都是膜題解膜題解,感覺提供一些關鍵點在進行思考的話能夠更快的加強算法能力,所以我就稍微的寫一寫。
upd 3.8 : 懶癌晚期不想寫東西了,我就記錄一些最近做的不想寫的傻逼題吧。
【BZOJ1001】 最小割轉平面圖。
【BZOJ1002】 狀態壓縮dp。
【BZOJ1003】 最短路+dp。
【BZOJ1004】 每一種洗牌對應一種置換,用一下burnside。
【BZOJ1005】 prufer。
【BZOJ1006】 弦圖最大勢。
【BZOJ1007】 維護凸殼。
【BZOJ1008】 補集轉化。
【BZOJ1009】 kmp+矩陣優化。
【BZOJ1010】 斜率優化。
【BZOJ1012】 線段樹。
【BZOJ1013】 高斯消元。
【BZOJ1014】 splay維護hash值。
【BZOJ1015】 離線轉成插入操作並查集維護。
【BZOJ1016】 從小到大插邊維護每個連通分量的最小生成樹個數。
【BZOJ1019】 令f(i,j)表示從i柱子移動到另一個柱子盤子為j的操作次數,g(i,j)表示從i移動到另一個柱子盤子為j的移動位置。
【BZOJ1022】 SJ定理。
【BZOJ1024】 dfs。
【BZOJ1025】 考慮這個由多少個環且每個環大小和為n,對於每種狀態的貢獻就是lcm(各個環大小),那么就是求lcm值的種類。
【BZOJ1027】 其中有一維是沒用的,這樣就是一個經典問題:給定平面n個點,求最小凸包包圍查詢點。這個用最小環就能解決。
【BZOJ1028】 貪心。
【BZOJ1029】 貪心。
【BZOJ1030】 ACM上面dp。
【BZOJ1031】 SAM。
【BZOJ1034】 花式貪心。
【BZOJ1036】 樹鏈維護值。
【BZOJ1037】 設f(i,j,k)前i個人有j個男的從i開始向前的連續段里最多有k個男與女的差,再設個g(i,j,k)同樣地不同的是最多有k個女與男的差。
【BZOJ1040】 基環樹。
【BZOJ1041】 很容易知道\(2r=d(a^{2}+b^{2})\),其中\(d=gcd(r+x, r-x)\), \(r+x=da^{2}\), \(r-x=db^{2}\),我們枚舉d,然后再枚舉a就可以了,注意到如果對於合法的a, b如果交換他們的值對應的x, y是不變的,那么就將a枚舉的值縮一半就可以了,最后乘4加4就可以了。
【BZOJ1042】 容斥原理。
【BZOJ1044】 第一問二分。第二問dp。
【BZOJ1045】 經典問題,轉化成每個點向正方向扔多少點,轉化下就是求一個中位數。
【BZOJ1046】 dp。
【BZOJ1047】 單調隊列或用ST表。
【BZOJ1048】 dp。
【BZOJ1049】 dp依照前一個dp值可以寫一個O(n^3)的dp但是跑的飛快。
【BZOJ1050】 枚舉最小邊跑一下。
【BZOJ1051】 tarjan。
【BZOJ1052】 二分+貪心覆蓋下。
【BZOJ1053】 爆搜。
【BZOJ1054】 狀態壓縮爆搜下。
【BZOJ1055】 dp。
【BZOJ1056】 平衡樹。
【BZOJ1057】 維護上左右的值單調隊列維護下。
【BZOJ1058】 set維護。
【BZOJ1059】 就是求是否存在n個互不同行或同列的點。
【BZOJ1060】 dp。
【BZOJ1061】 線性規划轉化網絡流。
【BZOJ1066】 網絡流。
【BZOJ1067】 分類討論下就好了。
【BZOJ1068】 dp。
【BZOJ1069】 旋轉卡殼。
【BZOJ1070】 每個員工拆成n個點,網絡流。
【BZOJ1071】 我們考慮(min_s, min_h)對應的一個集合S,那么(min_s, min_h+1)對應的集合不過是S上加一些值再減掉min_h的點,那么考慮直接枚舉min_s, min_h然后單調維護就可以了。
【BZOJ1072】 維護下模的值。
【BZOJ1076】 期望dp。
【BZOJ1079】 f(i1,i2,..,i5,last)表示能塗j次的是i_j,last顏色為last。
【BZOJ1083】 最小生成樹。
【BZOJ1084】 m很小可以dp小。
【BZOJ1085】 枚舉上限步數然后搜索。
【BZOJ1086】 樹分塊。
【BZOJ1087】 狀態壓縮。
【BZOJ1088】 暴力。
【BZOJ1098】 遞推。
【BZOJ1090】 dp。
【BZOJ1095】 維護一堆樹重心。
【BZOJ1101】 mobius反演。
【BZOJ1103】 線段樹維護dfs序。
【BZOJ1106】 樹狀數組維護下。
【BZOJ1108】 畫個圖找下規律。
【BZOJ1110】 砝碼的種類不多不會超過log次,考慮從小到大扔砝碼就可以了。
【BZOJ1113】 維護一個單調棧。
【BZOJ1115】 前后做差就是階梯nim。
【BZOJ1121】 找規律。
【BZOJ1132】 按極角排,就可以算一坨叉積和。
【BZOJ1135】 二分圖匹配,用Hall定理優化。
【BZOJ1146】 區間k大。
【BZOJ1176】 cdq分治。
【BZOJ1179】 強連通分量。
【BZOJ1189】 網絡流。
【BZOJ1190】 可以dp下有a*2^b+(w&((1<<b)-1))容量。
【BZOJ1191】 匹配一下。
【BZOJ1192】 嘿嘿嘿。
【BZOJ1196】 二分+MST
【BZOJ1202】 差分約束或並查集維護與父親的差值。
【BZOJ1207】 暴力。
【BZOJ1208】 平衡樹。
【BZOJ1210】 插頭dp。
【BZOJ1211】 prufer序列。
【BZOJ1212】 Trie+dp。
【BZOJ1213】 高精度運算。
【BZOJ1218】 dp。
【BZOJ1228】 對一個組<a,b>進行找規律就可以了。
【BZOJ1237】 將a,b都排序,只有連續三個數可以被調整,也就是每個數最多能被調整3次,這樣直接dp就可以了。
【BZOJ1251】 平衡樹。
【BZOJ1257】 經典O(n^0.5)。
【BZOJ1260】 區間dp。
【BZOJ1263】 划分盡量多3。
【BZOJ1270】 dp。
【BZOJ1293】 掃描一下,用一個堆維護刪除。
【BZOJ1295】 枚舉判斷可行。
【BZOJ1296】 dp。
【BZOJ1303】 從b位置向前向后統計下。
【BZOJ1305】 拆成三個點,並且判斷是否可以完成i首歌。
【BZOJ1306】 記憶化搜索。
【BZOJ1316】 樹分治把詢問打包用set維護下。
【BZOJ1319】 求出原根,BSGS,線性方程弄一弄。
【BZOJ1336】 最小圓覆蓋。
【BZOJ1337】 最小圓覆蓋。
【BZOJ1396】 建出后綴樹,一個節點代表的這一段[l,r]肯定是r-l+1,對於前面的1~l-1就是r-i+1的貢獻了。
【BZOJ1398】 ①建出SAM,求這個串的最小表示。②對於每個頭開始求一個hash,然后map判一判。
【BZOJ1406】 x^2=ny+1=>n|(x-1)(x+1),數很少判判重就可以了。
【BZOJ1411】 手玩一個位置的影響,只關乎兩個,暴力下。
【BZOJ1412】 最小割。
【BZOJ1413】 對於[l,r]一邊只有一個能改變勝負狀態,那么就dp這個東西。
【BZOJ1414】 中間插空,先求一遍馬拉車,對於每行正反跑一邊,用O(1)-RMQ跑。
【BZOJ1417】 狀態壓縮下直接暴力dp。
【BZOJ1420】 同1319。
【BZOJ1429】 結論:S(2^k*m)=[m is odd] k=0?8d(m):24d(m)。其中d(n)為約數和。
【BZOJ1432】 手玩。
【BZOJ1433】 對每個拆點,in(i)->out(i)表示睡自己床,in(i)->out(j)表示i睡j的床,跑個最大流就可以了。
【BZOJ1441】 gcd。
【BZOJ1452】 2D數據結構。
【BZOJ1465】 設扔到左邊的個數,然后列方程,可以得到一個絕對值式子可以用中位數做。
【BZOJ1467】 同1420。
【BZOJ1468】 樹分治。
【BZOJ1482】 就是求gcd(i,j)=1的個數。
【BZOJ1483】 啟發式合並。
【BZOJ1485】 這個就是個catalan數。
【BZOJ1486】 二分判是否有負環。
【BZOJ1488】 搜索每個環的大小,然后通過點的置換算邊的置換。
【BZOJ1492】 按提示列dp,cdq分治。
【BZOJ1494】 狀態數很少,dp用matrix加速。
【BZOJ1497】 最大權閉合圖。
【BZOJ1500】 平衡樹。
【BZOJ1502】 圓並。simpson。
【BZOJ1503】 平衡樹。
【BZOJ1552】 平衡樹。
【BZOJ1566】 注意到有個平方,我們就可以理解為兩個人在取序列相同的方案有多少,那么直接dp搞了多少個,第一個人在上面一行弄了多少,第二個人弄了多少。
【BZOJ1571】 dp。
【BZOJ1572】 堆貪心。
【BZOJ1574】 BFS一下。
【BZOJ1576】 先找出最短路樹,枚舉每條非樹邊,然后就是把lca到兩個點之間的邊給更新,這個用樹鏈剖分就可以了。
【BZOJ1597】 斜率優化。
【BZOJ1742】 dp。
【BZOJ1756】 gss的線段樹。
【BZOJ1758】 二分+樹分治。
【BZOJ1786】 考慮所有-1,顯然單調最好,那么就dp第i個-1的值為j,前綴和優化下就是O(nk)。
【BZOJ1787】 LCA貪心下。
【BZOJ1789】 LCP貪心下。
【BZOJ1798】 經典打標記。
【BZOJ1800】 暴力。
【BZOJ1801】 dp。
【BZOJ1814】 插頭dp。
【BZOJ1815】 點置換群算邊置換。
【BZOJ1816】 二分暴力。
【BZOJ1818】 掃描線+線段樹維護。
【BZOJ1821】 二分+並查集。
【BZOJ1828】 離線+線段樹。
【BZOJ1906】 顯然的我們枚舉兩個螞蟻,分類討論一下就可以了,估計是要用O(1)的LCA。
【BZOJ1937】 樹邊被非樹邊覆蓋可以列一個不等式發現就是求頂標,KM算法算一下。
【BZOJ1977】 考慮每條非樹邊用lca求一求就好了。
【BZOJ1999】 求出直徑,在直徑上two pointer搞一搞。
【BZOJ2151】 加入每一個點用鏈表維護一下,每加入一個點將相鄰兩個點-中間的點扔到隊列,並將這三個點合並成一個點。
【BZOJ2177】 轉化成切比雪夫距離,那么對於一個點i分成8部分,那么有用的就是跟i最近的點,那么一個點最多8條邊。跑一個MST就好了。
【BZOJ2182】 求出無向圖的絕對中心之后瞎搞搞就可以了。
【BZOJ2362】 把重心當根統計直徑不超過n的二叉樹個數就可以了。
【BZOJ2368】 枚舉每一個子樹,然后提重心dfs判重構就可以了。
【BZOJ2466】 高斯消元。
【BZOJ2521】 考慮加入的邊,那么跟它聯通的邊比它小的這個圖不能聯通,那么就是對於每個邊加了一些值之后不連通,那么考慮最小割。
【BZOJ2560】 暴力dp。
【BZOJ2561】 跟2521同樣做就可以。
【BZOJ2569】 提重心暴力組合數維護。
【BZOJ2690】 離線算法就是把所有串建一個trie然后dfs序就可以,在線只要把dfs動態維護,用重量平衡樹就可以。
【BZOJ2740】 將串reverse下,找到一個最小表達式,找這個位置到底的重復串,將這部分看成s[0..i-1],再對剩下的做一個最小表達式就可以了。
【BZOJ2750】 對每個點dijkstra一遍,然后考察每條邊有效貢獻就可以了。
【BZOJ2783】 set維護。
【BZOJ2785】 跟2569差不多。
【BZOJ2812】 二分+樹分治類似1758做法。
【BZOJ2822】 考慮必須選n個,每次必須划分成兩隊,那么就是catalan數。
【BZOJ2932】 樹上dp。
【BZOJ3103】 同3350。
【BZOJ3166】 枚舉次大值就能得到可行區間用可持久化trie就可以了。
【BZOJ3219】 跟2812同樣做。
【BZOJ3226】 就是一個在線段樹上打打標記。
【BZOJ3227】 考慮節點個數樹高列兩個dp推來推去就好了。
【BZOJ3251】 考慮一組數列不能構成三角形最多不超過46個,那么長度小於46就暴力。
【BZOJ3252】 考慮葉子到根最大的肯定選,那么用線段樹維護一下就可以了。
【BZOJ3262】 三維偏序,排序cdq區間維護。
【BZOJ3276】 按照到初始點的距離排序,每次取肯定是在可行范圍內取最小重量,然后把取出來的扔到數組里面不停的做,知道不可執行為止。
【BZOJ3302】 取樹最中間的邊,然后求出兩塊的重心,那么兩個重心一定在這兩個求出來的重心的鏈上,調整下就好了。
【BZOJ3322】 火車的那些點都是一樣的就縮點,剩余的求最大生成樹樹上倍增求求就可以了。
【BZOJ3323】 注意到只有[l,r-1]不會修改,就在l之前加個0,把r加到r+1上。
【BZOJ3324】 可以看出來前面肯定有一坨1,那么剩余移動數不多直接考慮dp。
【BZOJ3325】 manacher做一遍把相同的位置找出來。
【BZOJ3326】 考慮每一位的貢獻拿組合數瞎算算就好了。
【BZOJ3350】 manacher求出所有相等不等的關系,相等用並查集維護,不等連邊。
【BZOJ3553】 樹鏈剖分維護上面的值用二分找下位置。
【BZOJ3586】 枚舉字符串出現的集合和當前匹配到的字符串的位置,這個可以用gauss來消元,狀態數大概不會超過500。
【BZOJ3589】 樹鏈剖分+容斥。
【BZOJ3321】 matrix tree找規律。
【BZOJ3731】 塊狀樹。
【BZOJ3754】 邊權大小不大,枚舉平均數,跑個MST。
【BZOJ3756】 在Trie上建SAM,跑下S串就可以了。
【BZOJ3757】 樹上莫隊。
【BZOJ3748】 面向數據找規律。
【BZOJ3799】 枚舉前綴相等長度,后面取最小字典序。
【BZOJ4180】 建出T的SAM,f(i,j)表示i開頭j結尾的最短長度,二分倍增下。
【BZOJ4257】 二分下最小值,然后轉化成圓鏈,最后肯定要成l1l2l3..lnr1r2..rn這樣看下不降序列是否達到k就可以了。
【BZOJ4300】 按位dp。
【BZOJ4302】 分類討論。
【BZOJ4303】 kd tree來打標記。
【BZOJ4304】 縮點變成DAG,討論每個點的進出可行點集用bitset維護。
【BZOJ4305】 首先gcd(*)=d可以轉化成d|gcd(*),這會耗費一個log,之后就是組合數搞一搞就可以了。
【BZOJ4310】 二分下最小串,從后往前找就可以了。
【BZOJ4311】 按時間分治[l,r],在這個時間出現的向量找出來,答案肯定在凸包上。
【BZOJ4379】 顯然我們枚舉每個刪邊,那么我們可以dp出上面一塊的直徑和子樹的直徑,做這個就只用搞出第一長第二長第三長的鏈就可以了,在記錄一個向上延伸。
【BZOJ4380】 可以先dp出一段區間用的價格的代價,然后dp區間的最大花費。
【BZOJ4381】 按步數大小分塊跑一下。
【BZOJ4386】 每個點拆成3個,記錄長度為i的方案數,記錄下一堆矩陣倍增搞一搞就可以了。
【BZOJ4401】 求下被整除d個數的子樹個數推一推就好了。
【BZOJ4402】 需要觀察出一個性質,本質不同的就兩種序列,然后組合數算算就可以了。
【BZOJ4405】 一般圖匹配。
【BZOJ4407】 稍微推推式子就可以了。
【BZOJ4408】 CC原題。
【BZOJ4414】 c*f_{n+m+1}=f_{n}*f_{m}+f_{m+1}*f_{n+1}。
【BZOJ4416】 注意到n>21時不存在解。用f_{S}表示用了S集合內的元素要到串的第f_{S}位才能表示完全,再用一個轉移狀態函數表示對於第i位接受了個j要到第幾位。
【BZOJ4417】 推一下式子可以發現是個矩乘。
【BZOJ4419】 set。
【BZOJ4421】 亂搞。
【BZOJ4424】 搜一個dfs生成樹考慮返祖邊就可以。