1. 程式人生 > >2018年11月18日訓練總結

2018年11月18日訓練總結

這周基本沒看什麼資料。做了幾道題。。。

打了兩場cf的比賽,一場div.2 ,一場div.3 雖說總體來說上了幾十分,但是還是因為讀題的問題掛了終測(兩場都掛了一道)

題目很簡單,但是沒讀對。div.2那場A掛了終測(讀錯題),B不會(質因子分解),說明對分解質因子類的題目還是不敏感。D題也沒讀懂。。。

div.3前三道題暴力,第四道簡單二分,第五道dp(O(n))或者列舉+二分+暴力(O(nlognlogn)),dp的做法沒想到,思想還是比較重要。第六道暴力三維dp,第七道是第六道加單調佇列優化(很經典)。比賽的時候知道是這個做法但是沒調出來,賽後看了別人的程式碼才會寫。這兩天一直在想這個題,從想出演算法,到設計思路,到程式碼實現,到一些細枝末節,直到最後出結果是怎麼考慮的。

壓縮掉的第三維是上一次在哪天買的。dp[i][z]表示前i天買了z件衣服的最大值(其實是第i天一定買了衣服)

dp[i][z]=dp[i-j][z-1]+a[i]。這裡的j就要求和i的距離小於k了。顯然z確定後,dp[i][z]的值隨著i的增大而增大(且滿足決策單調性)。同時還要注意不合法的-1情況。因此對每個z用一個單調佇列壓縮掉第三維,初始佇列壓入(0,dp[0][z-1])隊頭據i>k天就隊頭出隊,dp[i][z]=隊頭+a[i]。

dp[i][z-1]>=隊尾隊尾就出隊。然後(i,dp[i][z-1])入隊。注意隊頭>隊尾直接break。

這個單調佇列優化dp的用法我還是不能熟練掌握,還是需要多加的練習和思考。

然後打了去焦作的隊伍的練習賽。除簽到題外,有一道求最小比率區間size(l,r)/(r-l+1)的題。乍眼一看又是分數規劃,考慮二分答案。設為mid,則size(l,r)/(r-l+1)<=mid(size(l,r)為下標l~r中不同的數字個數)

移項變形,得size(l,r)+l*mid<=mid*(r+1)     參考題解​​​​​​​

但是我沒想到左邊這個可以用線段樹維護。。。(參考線段樹離線求區間不同數字個數的思路),線段樹初始化為l*mid,然後二分答案mid,對於每個mid,列舉區間右端點r,然後對於a[i],update(pre[i]+1,i,1,1,n)。(pre[i]為i上次出現的位置。)然後查詢1~i的最小值和mid*(r+1)比較一下就行了。總複雜度(O(nlognlogn))。。。並不是很難理解,但是場上過的人數很少。

還有一道求x的k次方的因子個數,實際上x的因子個數為(1+r1)*(1+r2)*...*(1+ri) ri為其質因子的冪次。d(n)裡n的取值最大1e12,那麼要判斷它是不是素數只需計算到sqrt(n),所以打個1e6的素數表,如果它是個合數,就可以用打好的表裡的素數進行分解,如果是個素數,那麼它對最後結果的貢獻就是k+1。參考題解

而本題答案為(1+k*r1)*(1+k*r2)*...*(1+k*ri) ri為其質因子的冪次。由於是求某個區間的,所以與處理一下1e6以內的質因子,然後

然後就是歐洲今年的某場區域賽。。。2個小時才做出來簽到題。。。(二分+字首和,也可用樹狀陣列,不過細節很麻煩,還要分情況討論)。。。唉,真是菜,繼續努力。

新生賽的報名已經開始了好幾天,人數已經快破百了。。。希望之後報名人能少一些,機房也只能裝最多180人。。。(而且人一多伺服器會很卡)學長們基本已經出完了題目,坐等15週週末(或16週週末)比賽。。。希望新生們好好努力,早日超越我們這些老菜雞。。。