1. 程式人生 > >2017開學訓練第五週週中總結

2017開學訓練第五週週中總結

  這周前幾天交錯著看了網路流和線段樹。

  對於網路流,看了一下費用流的模板,費用流就是最大流的升級版,其要點就是找增廣路的時候每次都找費用最低的,最後可以得到最小的費用流。然後看了一下簡單的網路流的建模題目,以及方法介紹。剛剛起步發現一是方法不熟練,二是經常建出來反向的模型,但是我按照最大流的做法看好像反向也能做,但還沒有具體驗證是否這個說法真的成立。另外建模還需要很多很多的有關圖論裡的知識點,比如路徑最短的最大流,建模的時候就需要用到最短路徑的演算法等等。但是不排除模板還沒有看的全面,題目認知不全等原因,所以繼續進行知識點的學習。

 然後做了幾道有關於樹狀陣列和線段樹的題目,線段樹中見識到了二維的線段樹(約束區間有兩個),這個題目資料量很小,所以用線段樹再好不過了。這個題目我在做的時候打破了對以前線段樹的程式碼的認知,比如tree[id].l==l&&tree[id].r==r和如tree[id].l>=l&&tree[id].r<=r這兩種經典的寫法,在理解方面,這是兩個完全不同的寫法,我一直認為第二個是對的,因為以前試過把樹狀陣列的區間端點輸出出來,發現並不是每個端點都能正好遍及的,所以認為第二個做法是對的,後來才理解這原來只不過是兩種程式碼風格,都是正確的,這樣我就可以放心的確定自己所需要的程式碼風格了。比較有特點的還有一道二維取反的題目,這個題目藉助區間染色的思路,不過不是+,而是!操作,因為維數較高,可以藉助畫圖理解,加了多少次,減去多少次,都要計算的十分清楚才是(還有一道三維的同樣的題目,更為複雜一些)。還有一個比較大的收穫就是dp求最大上升子序列的長度的演算法的優化,本來想查用線段樹的優化方法,可是看了幾個部落格之後發現都不能很好的解決問題,或者解決的是完全另外一種的問題,所以就學習了一下二分法優化的dp求最長上升子序列的長度。演算法的思路就是簡而言之就是各得其所,用dp陣列存長度為i序列的最優(也就是最低)的下標是誰,搜尋的時候用二分,使得演算法的複雜度降低到了n*log2n。

  往後的幾天就進入假期了,更需要加緊的學習,拓寬自己的知識面和能力,為之後做準備。