改題(t3)真的改到自閉。。。
第一眼錯覺是網路流,但是在每個石頭,站不同青蛙時跳躍的代價不同,就不太能了。
這題其實和之前noip模擬16的那個青蛙題有點像,只不過這題加了代價。首先乙個性質是:對於乙個青蛙,如果他一心想跳到對面(即不考慮踩光石頭),最優是不花費,要不然只花一次就過去。那麼我們可以看看所有石頭可以讓多少只青蛙不花費過去,讓最貴的青蛙免費過去一定不差,假如它花費,那麼可以替換為便宜青蛙花費使之更優。這個問題就和blue一樣了,只要不斷挨個讓青蛙往右跳,跳他能免費到的最大距離。剩下的青蛙花一次費過去。如果中途有兩石頭距離大於d,就是沒有免費過去的,這時候需要用最便宜青蛙去踩石頭。
貪心問題真是不好想到,至今不懂貪心的真正內涵。
主要思想是把自然數冪和化成k級別的多項式,那麼原來的列舉值域就成了乙個底數,列舉k就可以接受了。
用伯努力數拆自然數冪和,不斷提前列舉順序,加上二項式展開,最後就能把迴圈全化成k級別的,伯努力數$k^2$預處理就行,然後剩下的部分都可以預處理了。
式子特別長,細節挺多的吧。
發現題目讓求得其實是乙個多維字首和?可以理解成定積分。最裡層的多項式冪和是乙個k+1次多項式,它做一次字首和就成了k+2次多項式。然後再做字首和(這次自變數是$i$,那麼關於i的多項式是關於$a+i*d$的多項式變換(畫成影象的話就是壓縮d倍)得來的),同樣,變為k+3次多項式。那麼用插值就可以了。
t3:具體做法並不想多寫了。這題用到sam和lct,但是用的都是他們的性質,在原理的基礎上拓展。
一開始我就想錯了,我查詢時直接讓size>=2的endpos的len去做貢獻,而沒有考慮詢問區間對具體的endpos位置的要求。也就是說,對於詢問[l,r],當endpos中有兩個落在[l,r]才可以做貢獻。我們考慮往後insert時,加入乙個字元的影響(貢獻)。原先的len可能不能貢獻,但是一旦它後面有了包含這段的子串(他們就是一對字串了),就能做貢獻了。字尾parenttree的性質:跳father相當與跳到字尾,那麼新點的祖先們就可以一起(和新點)做貢獻了。具體的貢獻要取決與endpos的last位置(最右位置),所以要維護last,鏈修改,動態邊,就用lct了。對於答案的維護,考慮節點的貢獻,當詢問包含它時才做貢獻。還是考慮先滿足一維:對於最後新增的每乙個位置n,他一定可以被右端點大於n的區間包含。對於左端點:如果一點p的最優答案是len,那麼只有左端點<=p-len+1時才貢獻。二分詢問的答案mid,那麼要是有》=mid的答案,起碼要從l+mid-1開始貢獻,那麼查詢[l+mid-1,r]的最大點貢獻驗證是否》=mid。這兩維用可持久化線段樹維護最大值。
這題又調了一整天,發現我的很多問題。首先是思考問題很不全面,細節不清。除錯能力太拙劣。對於這樣的抽象複雜的問題,手模、輸出變數簡直是浪費時間。靜態差錯非常重要啊。
省選模擬5
每塊石頭都必須要踩一次,那麼不難發現讓最便宜的青蛙踩盡量多的距離超過d的石頭,而其他青蛙盡量跳,跳不過去了直接從1跳到n一定最優。所以只要判斷出最多可以讓多少只青蛙跳過去即可,二分即可。然而沒有開long long 100 0。暴力將伯努利數代入即可。前兩天做了一道插值讓我一直以為這道題是插值,然而...
省選模擬5 題解
因為每個青蛙都可以一步跳到終點。所以二分幾個青蛙可以無消耗跳到終點,只要讓最貴的幾個青蛙跳過去。之後特判一下乙個青蛙都跳不過去的情況就好了。伯努利數練習題。不斷的把自然數冪和用伯努利數展開,順便二項式展開一下就好了。另外分析可知原式可以化為乙個多項式的形式,所以通過插值也可以求出。考慮維護sam中每...
省選模擬測試5
因為只有包含關係和不相交關係,就可以根據包含關係 o n 2 建樹,o n 跑樹形dp 考慮優化建樹,把乙個圓看成乙個正方形然後做掃瞄線,線段樹每個節點維護set,存縱座標在這個區間的正方形的編號 需要判四個角,暴力跳就行了 大多數情況下複雜度 o n log 2n 發現 t n,k nc n 1,...