刷題啦啦啦..

前面說點什麼..

比較基礎的算法什麼的也學的差不多吧.. 那麼就開始刷題補補漏洞啊..


刷題走起01..

來看看做了幾題..:

50/50

完成啦完成啦!!!!!

[2016.5.21] 1007 [HNOI2008]水平可見直線
其實就是半平面交的裸題.. 然後其實並不需要用到正式的半平面交,只需要用到思想即可..

[2016.5.23] 1009 [HNOI2008]GT考試
這道題是矩陣乘法+kmp,動態方程f[i][j]表示第i個位匹配到第j位不吉利數字。對於j來說,k爲枚舉的第i+1個數,假如s[j+1]!=k,那麼就要去找前面第一個p使得s[p+1]==k,所以這個就要用到kmp..

[2016.5.24] 1010 [HNOI2008]玩具裝箱toy
這道題很明顯就是斜率優化啊.. 對於i來說j和k(j>k),當j比k優的時候爲:
fj+(ij1+sisjL)2<fk+(ik1+siskL)2
那麼爲了把(ij1) 給去掉,我們把si=si+iL=L+1
fj+(sisjL)2<fk+(siskL)2
化簡一下就好啦
(fj+s2j+2Lsj)(fk+s2k+2Lsk)2(sjsk)<si
然後再維護一個下凸就好啦..

[2016.5.25] 1013 [JSOI2008]球形空間產生器sphere
相鄰兩個可以列一個方程啊..
(a1x1)2+(a2x2)2+(a3x3)2+...+(anxn)2=(b1x1)2+(b2x2)2+(b3x3)2+...+(bnxn)2
然後化簡一下..
2(a1b1)x1+2(a2b2)x2+2(a3b3)x3+...+2(anbn)xn=a21b21+a22b22+a23b23+...+a2nb2n
很明顯的高斯消元.. 然後又複習了下高斯消元..

[2016.5.25] *1017 [JSOI2008]魔獸地圖DotR
絕對Tree_DP好題啊.. 參考了一下hzwer的思路,還有大神vfleaking的看不懂
vfk:http://vfleaking.blog.163.com/blog/static/17480763420130242646240/
hzwer:http://hzwer.com/5198.html
由於父親累計答案要依靠孩子,那麼定義DP數組f[i][j][k]爲節點i把j個給父親,費用爲k可以獲得的最大力量值
那麼對於葉子節點x來說 f[x][i][j*cost[x]]=(j-i)*val[x];
由於合成是不需要費用的,所以對於非葉子節點x來說,更新f[x][i][j]時就需要知道孩子節點中總費用爲j的最大力量值。定義g[i][j]爲第i個孩子費用爲j的最大力量值,然後進行DP g[tot][i]=max(g[tot][i],g[tot-1][i-j]+f[y][p*a[k].d][j]) p爲當前枚舉的要製作p件x
f[x][i][j]=max(f[x][i][j],g[tot][j]+val[x]*(p-i));

[2016.5.26] *1018 [SHOI2008]堵塞的交通traffic
bzoj官方題解鎮樓:http://www.lydsy.com/JudgeOnline/upload/201604/sol(4).rar 反正我沒看,rp--
用線段樹維護這段區間左上右上左下右下四個頂點互相是否能到達情況,然後合併.. 然後判一下一些奇奇怪怪的情況.. 就行了..
這道題是要手寫暴力合併公式的.. 我做的時候忽略了一種,調了30min.. too navie啊..

[2016.5.27] *1019 [SHOI2008]漢諾塔
放上大爺的題解:http://blog.sina.com.cn/s/blog_76f6777d0101b8l1.html
由於題目要求只需要把n個盤子從第一根柱子移到其餘的任意一根,所以我們考慮這道題要維護的就是移到哪一根柱子花費最少和移動到哪一根.. 詳情就看大爺的題解..

[2016.5.27] 1025 [SCOI2009]遊戲
先把問題轉化一下:求和爲n的數的LCM方案數
看看下面的情況:
1)如果我把數分爲axby(gcd(a,b)=1) 和其他一大堆數,那麼這種方案和ax,by,1,1,...,1 和其他一大堆數是等效的
2)如果我把數分爲ax,by(x>y) 和其他一大堆數,那麼這種方案和ax,1,1,...,1 和其他一大堆數是等效的
那麼的話,就可以按照質數來進行dp,f[i][j]表示訪問完i個質數,和爲j的方案數。所以就一大堆遞推就好啦.. 打的時候忘記是算和..

[2016.5.30] *1027 [JSOI2007]合金
首先這道題第三維是是沒有什麼卵用的.. 因爲你知道了前兩維,第三維就知道了,於是每一種合金都能用平面上的點來表示..
而且我們發現,由於沒有給質量,兩種合金合起來可以達到所有在這兩點組成線段中的所有點
那麼這道題就變成了:在m個點中找最少的點使得組成的多邊形能覆蓋n個點
然後就把不把n個點集合分成兩半的點相連然後再求最小環.. 用floyd就可以了.. 你以爲真的這麼簡單?還有很多細節呢!
給一組某大神的數據:
2 1
0 0 1
0 0.5 0.5
0 1 0

[2016.5.30] 1029 [JSOI2007]建築搶修
大水題啊.. 就是貪心一下啊..
首先先按找t2排個序..
對於當前要插入的i,我們要有個貪心策略:
如果我插入i仍滿足條件,則直接插入,否則:
1)如果插入進去最大的t1還比i的t1要小,直接忽略i任務
2)否則,就把這個最大的t1去除,再插入i任務

[2016.5.31] *1030 [JSOI2007]文本生成器
這道題要求可讀的,那麼我們就用總數減去不可讀的就好了..
首先建ac自動機,然後用dp數組f[i][j]表示第i位走到第j個節點的不可讀方案數,枚舉下一位填a~z26個字母進行遞推咯.. mdzz居然建fail指針還沒有放進隊列中..錯了4次..
論對拍的重要性啊..

[2016.5.31] 1031 [JSOI2007]字符加密Cipher
做了一道大水題..
直接sa就好了.. 記住要倍長一段..

[2016.6.1] 1038 [ZJOI2008]瞭望塔
半平面交的一道大裸題..
要記住 分段一次函數極值在頂點處..

[2016.6.2] *1040 [ZJOI2008]騎士
一看就是環套樹+樹形dp啦.. 但是就是傻逼呵呵不會處理環和邊上的點.. 非常感謝NanoApe隊長耐心給我講解啦啦啦..
首先要把這個dp分成兩種情況,因爲每一棵環套樹都是有且僅有一個環的,所以我們斷掉環的一條邊使其變成一棵樹,並且隨便取斷掉的邊兩端點任意一個爲根進行dp:
1)不管斷掉的邊另一個點選還是不選,統計答案只取f[root][0]
2)斷掉的邊另一個點固定不能選,即f[x][1]=inf,取f[root][0],f[root][1]的max值

[2016.6.2] *1042 [HAOI2008]硬幣購物
hzwer的blog:http://hzwer.com/5286.html
做了一道容斥原理的題.. orz啊感覺學不會啊..
記錄f[i]爲總和爲i的方案數,然後答案就是得到面值爲s的方案數-第1種貨幣超過限制的方案數-第2種貨幣超過限制的方案數-…+第1、2種貨幣超過限制的方案數+第1、3種貨幣超過限制的方案數+…-第1、2、3種貨幣超過限制的方案數-第1、2、4種貨幣超過限制的方案數-…+第1、2、3、4種貨幣超過限制的方案數

[2016.6.2] 1044 [HAOI2008]木棍分割
二分貪心求解.. 然後dp求方案..
f[i][j]表示前j個分成i段的方案數,可以統計前綴和就省點時間,可以滾動不會爆空間..
啊傻逼啊.. 忘記mod錯了好多次啊啊啊..

[2016.6.5] 1043 [HAOI2008]下落的圓盤
這又是一道比較煩的計算幾何的題目
對於一個圓x,就是找在它上面的圓與它重疊的部分的周長,總長度減去它就是圓x可以貢獻的價值。問題就在於如何去找重疊部分的周長的並集,大概就是記錄重疊部分在圓的弧度,然後按照類似線段覆蓋的方法來計算

[2016.6.8] 1069 [SCOI2007]最大土地面積
用旋轉卡殼枚舉較遠的點對再找離這條線段最遠的兩個點就是當前最大的土地面積,時間複雜度爲O(n2) ,這道題是可以過的。
不要用常數大來掩蓋自己的TLE,常數大也可以優化的啊,況且我還不是因爲這個TLE的.. 仔細檢查自己的代碼吧.. md凸包都能打錯.. AFO..

[2016.6.10] 1084 [SCOI2005]最大子矩陣
來來來再看一遍題目.. 這裏寫圖片描述
那麼就分m=1和m=2來做咯..
m=1的時候f[i][j]表示第i位分成j段的最大和..
m=2的時候f[i][j][k]表示第一列的第i位,第二列的第j位分成k個矩形的最大和..
其實遞推還是很簡單的.. 但是這道題好像是分的矩形最大爲k而不是一定要k個..

[2016.6.10] 1071 [SCOI2007]組隊
這就是一道雙指針的題目.. 記住這人這裏寫圖片描述 要用long long不然要錯..
在檢查代碼的時候看到一篇挺好的blog,這個很清晰.. http://blog.csdn.net/Vmurder/article/details/45746089

[2016.6.11] 1049 [HAOI2006]數字序列
第一問很簡單就是求一個最長不降子序列.. 爲了在做第二問的時候更方便一點,可以在原串最後加上一個無窮大,在最前加上一個無窮小..
第二問的話比較難.. 首先要明白n^3的遞推方程,如果j能遞推到i(f[i]==f[j]+1),那麼我需要在[j,i]中找一個分割點k,那麼其中最優的變換情況就是[j,k]都變成a[j],[k+1,i]都變成a[i]。然後枚舉k是必要的,那麼我們就要減少j的枚舉次數來降低時間複雜度.. 這時候就要建一個鏈表來存,也就是f值爲i的以座標爲下標拉出一條鏈..
這樣的做法是n^2的,但是因爲是隨機數據,再加上數據也是很水的.. 就可以水過啦..

[2016.6.25] 1072 [SCOI2007]排列perm
中間跳了挺多道暴力和搜索的題..
這道題就是比較水的狀壓dp.. f[i][j]表示狀態爲i餘數爲j的方案數
然後再把總答案f[all][0]除以某些階乘即可..

[2016.6.27] 1061 [Noi2008]志願者招募
我覺得這篇題解講的很具體啊:https://www.byvoid.com/blog/noi-2008-employee/#more-916 沒錯我就是不想寫..
其實就是線性規劃.. 然後具體到底是什麼也不算太清楚就只是知道部分.. 看來以後還要補一補..

[2016.6.29] 1059 [ZJOI2007]矩陣遊戲
以前很傻逼的時候亂做的.. 看到有個紅叉然後就補了..
因爲操作只是換行和列,所以在同一行或者同一列的黑色格子是絕對不會變的,那麼我們只要看看是否存在n個行列各不相同的黑色格子就可以了.. 那就用二分匹配掃一遍咯..

[2016.6.30] 1079 [SCOI2008]着色方案
看到1<=ci<=5然後就想到了一個5^15很傻逼的方法.. 果斷不行..
然後再仔細一想,其實只要某兩種顏色剩餘可用是相同的話這兩個顏色在一定狀態下是等效的,那麼就定義f[s1][s2][s3][s4][s5][la]表示剩餘1次的顏色有s1種,剩餘2次的顏色有s2種..上一次填的是剩餘la次的顏色中的其中一種。那麼就可以往下推了..
用記憶化搜索和dp皆可..

[2016.7.1] *1063 [Noi2008]道路設計
這個絕對是一道好題啊!
很容易看出這是一棵樹,那麼就用樹形dp咯,由樹剖看出最遠的最多也就是logn,所以定義一個f[i][j][0-2]表示i節點最遠的爲j,與孩子節點連了0-2個,然後就隨便推咯.. 不知道怎麼推推到了一個很神奇還不用統計前綴和的方法.. 上網搜了下居然有個人跟我統計方案好像一樣..
這裏寫圖片描述
這道題還有一個比較坑爹的地方,有可能你要的答案f[1][ans][0]、f[1][ans][1]和f[1][ans][2]在模Q下都爲0.. 然後就注意下discuss吧..

—-我是分割線—
由於第一版的題目實在太難.. 棄坑去後面了..

[2016.7.3] 4590 [Shoi2015]自動刷題機
n眼後標算.. 就是很水的二分+判斷嘛..
由於我想多了二分範圍,爆long long..

[2016.7.3] *4591 [Shoi2015]超能粒子炮·改
這道題就是要求Ans=0ik(ni)
那麼這個就要用到Lucas定理:
n=sp+q,m=tp+r (q,r<p)
(nm)=(sp+qtp+r)=(st)(qr)(mod p)
然後就遞推啊.. 推到t=0爲止.. 附上核心代碼..
這裏寫圖片描述

[2016.7.5] *4593 [Shoi2015]聚變反應爐
這道題的做法來源於王隊長wangyurzee..
設f[x]表示x節點先激發自己再激發父親,h[x]表示x節點先激發父親再激發自己.. 那麼對於所有節點都有h[x]<=f[x]
Type A:對於孩子y,只有兩種可能,h[y]==f[y]或者h[y]+1==f[y]..
1.h[y]==f[y]那麼我肯定會選擇f[y],因爲這樣還能給x最多減少1點血量..
2.h[y]+1==f[y]那麼我肯定會選擇h[y],因爲這樣x已經對y造成了1點傷害而選擇f[y]不一定會給x造成1點傷害..
那麼統計f[x]就是x血量爲d[x]時候的最少花費,h[x]就是x血量爲d[x]-c[fa]時候的最小花費
Type B:
1.f[y]-h[y]>c[y]那麼我肯定會選擇h[y],這樣一定比選擇f[y]要優..(不信自己模擬一下,不細講..)
2.f[y]-h[y]<=c[y]這個時候就要考慮一下傷害溢出的問題了.. 選擇過多的f[y],x節點最多也只能減少d[x]點血量,所以在某些情況選擇h[y]會更加優一點.. 那麼這時候就要用到一種類似於揹包的做法,這個就要自己真的好好想想..
f[x]、h[x]的統計方法與Type A一樣..

[2016.7.7] 4592 [Shoi2015]腦洞治療儀
題意描述的好神奇.. 彷彿腦洞又大了很多..
那麼只需要維護一棵線段樹,線段樹維護以下權值:l0表示從左邊開始有多少個0,r0表示右邊開始有多少個0,sum表示這段區間有多少個0.. 這樣就好了..

[2016.7.7] 1090 [SCOI2003]字符串摺疊
其實就是一個dp.. f[i][j]表示i~j這一段的最小長度..
尼瑪一大坑點.. 壓縮後在前面的數如果是兩位數要兩個位置啊..

[2016.7.8] 4551 [Tjoi2016&Heoi2016]樹
一大傻逼題.. 然而我WA了3次.. md原來是位置最近..
就是dfs序+線段樹維護啊..

[2016.7.9] 4552 [Tjoi2016&Heoi2016]排序
一種很機智的做法..
二分答案,然後按照二分的值把大於等於它的標爲1,小於它的標爲0,然後用線段樹維護一下..

[2016.7.9] 4554 [Tjoi2016&Heoi2016]遊戲
其實這道題跟一個鋪木板的題目相類似..
於是就是二分匹配咯..

[2016.7.11] 4553 [Tjoi2016&Heoi2016]序列
首先我們要知道,如果j能繼承i的信息,就要滿足:xi<=minj、maxi<=x還有一個條件就是序號從小到大
然後就是一個很簡單的cdq分治了..

[2016.7.11] 4548 小奇的糖果
很簡單就看出來就是矩陣乘法嘛..
就是有點坑而已嘛.. (1)負數取模的問題 (2)不一定A<B<A+B ,比如-3,1,-2

[2016.7.12] *4513 [Sdoi2016]儲能表
數位dp嘛.. f[i][s1][s2][s3]表示第i位n的條件、m的條件、k的條件
其實挺好的題(對於我這種蒟蒻來說).. 嗯好好想想如何遞推吧..

[2016.7.12] 3295 [Cqoi2011]動態逆序對
首先用個樹狀數組求一開始的逆序對總數..
然後再開個數組f[i]記錄比i後刪的數中左邊比i大的和右邊比i小的數的個數和..
至於f[i]怎麼求嘛.. cdq分治啊..

[2016.7.15] *3170 [Tjoi 2013]松鼠聚會
這是一道好題呀.. 要把切比雪夫距離轉化成曼哈頓距離 即把點(x,y)變成((x+y)/2,(x-y)/2).. 證明如下:
這裏寫圖片描述

[2016.7.17] 3171 [Tjoi2013]循環格
這是一道很簡單的費用流題目啊.. 根據題意要求,每個點必須入度出度都爲1,就滿足了流量平衡..
然後只要原來箭頭指向連0,其餘三個連1就搞定了啊..
輸入噁心.. 不能直接讀入換行符..

[2016.7.17] 4514 [Sdoi2016]數字配對
很明顯的費用流啊..
首先按照ai質因數個數的奇偶性二分染色.. 然後能配對的連連邊.. 跑個費用流就好了.

[2016.7.17] 3174 [Tjoi2013]拯救小矮人
對於某種情況x和y兩人可以任選其一出去,且ax+bx<ay+by ,那我肯定選擇讓x出去..
因爲x先出去y能出去的可能性比y先出去x能出去的可能性更大.. 不信自己畫一下圖..
然後再用f[i]表示已經跑出去i個小矮人的剩餘最高高度,類似於揹包跑一下就行了..

[2016.7.18] 4516 [Sdoi2016]生成魔咒
先把整個串翻轉過來,然後做後綴數組,那麼每次新加一個字符就相當於新加一個後綴..
那麼這樣就很顯而易見的了,題目要求不同字串個數,就用當前字符串總子串個數-所有hei的和.. len*(len+1)/2-sum
用線段樹或者splay維護一下sum就好了..

[2016.7.18] 4517 [Sdoi2016]排列計數
m個固定的位置就是Cmn 種方案,其餘的n-m個位置就錯排
錯排公式爲fi=fi1i+(1)i (f0=1)
所以答案就是Cmnfnm

[2016.7.19] 4562 [Haoi2016]食物鏈
因爲不會違背生物學規律.. 所以最後出來的一定是一個拓撲圖,所以dp或者記憶化搜索就好了..
記住只有一個點不算食物鏈..

[2016.7.19] 4563 [Haoi2016]放棋子
仔細觀察發現這個01矩陣是沒有什麼卵用的.. 因爲你把每一行換一換其實也沒有什麼區別..
那麼就是很簡單咯就是個錯排+高精度咯
爲了方便我換了個公式:fi=(i1)(fi1+fi2)

[2016.7.19] 3190 [JLOI2013]賽車
其實就是一個很裸的半平面交.. 雖然我感覺暴力也能過..
就是要注意一下兩輛車相同屬性的情況吧..

[2016.7.20] 4443 [Scoi2015]小凸玩矩陣
首先要二分答案然後判斷是否有n-k+1個數比答案要小並且都不在同一行或同一列..
那麼用二分匹配的方式就能判斷了..

[2016.7.20] 4444 [Scoi2015]國旗計劃
就相當於線段覆蓋什麼的吧,通過貪心可以得到每一個線段的下一條線段是一定的
離散化,把環拆成鏈,然後用st表算該線段後2^i條是哪一條線段,最後再亂搞亂搞..

[2016.7.20] 1303 [CQOI2009]中位數圖
很簡單啊..不說了.. 只是想快點結束而已..

沒想到第一次的50題計劃就這麼被我草草結束了[捂臉]..

*好題


刷題結束了誒..

這次50題一共用了2個月..其實算起來也沒有兩個月,畢竟還要準備中考什麼的..
然後發現自己在做題的過程中還是too navie,很多該考慮的地方沒考慮周全導致了很多不必要的WA..
還發現了自己並不是很多東西都會了,還有分治、splay、lct、sam什麼的都不會,看來後面開始還要補一波..
在刷題的過程中還有不時地去看題解.. 其實很多東西還是自己好好想想纔好..
事實證明,實踐還是很重要的..
爲了那些,加油!

完結撒花!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章