弱逼發福利——BZOJ簡易題解


  本弱逼長期做題都是膜題解膜題解,感覺提供一些關鍵點在進行思考的話能夠更快的加強算法能力,所以我就稍微的寫一寫。

  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生成樹考慮返祖邊就可以。


免責聲明!

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



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