省選模擬5 題解

2022-03-16 18:57:37 字數 941 閱讀 9919

因為每個青蛙都可以一步跳到終點。

所以二分幾個青蛙可以無消耗跳到終點,只要讓最貴的幾個青蛙跳過去。

之後特判一下乙個青蛙都跳不過去的情況就好了。

伯努利數練習題。

不斷的把自然數冪和用伯努利數展開,順便二項式展開一下就好了。

另外分析可知原式可以化為乙個多項式的形式,所以通過插值也可以求出。

考慮維護sam中每個點的$last$,表示這個點endpos集合的最後乙個元素。

維護陣列$ans[r,l]$表示題意中要求的答案,首先將$ans[r,l]$直接繼承$ans[r-1,l]$

對於$np$節點,會導致祖先鏈上每個點的endpos集合新添元素$n$,也就是修改$last$。

只需要考慮$n$與最後一次出現的$last$兩個點所形成的字串。

對於$np$祖先鏈上的點$p$,分兩種情況更新$ans[r,l]$:

對於$last-l+1>=len_p$,直接對$len_p$取$max$。

對於$last-l+1容易發現這個東西是分別對等差數列和定值取$max$。

因為資料很水,用可持久化線段樹優化一下這個東西,通過從大神$g$_$keng$那裡學來的卡記憶體技巧(避免在同乙個根重複新建節點)就可以ac了。

正解要優化暴力跳祖先的過程。

發現$np$的更新祖先鏈上所有點的$last$為$n$的操作與lct中access的操作是一致的,似乎都對應著推平的性質。

所以不妨維護這個性質,使一條實鏈的$last$為一致的。

可以發現對於一條實鏈上$last$相同的所有$p$,只要維護最大的$len_p$。

在access的同時通過每條實鏈的最優的$len_p$更新答案就好了。

需要注意的一點是,在access的過程中,更新答案前,需要先截斷不想要的深度部分,避免不想要的$len_p$上傳到當前節點。

乙個更簡單的做法是只插入單點,在查詢時套個二分答案,順便維護區間最值就好了。

省選模擬5

每塊石頭都必須要踩一次,那麼不難發現讓最便宜的青蛙踩盡量多的距離超過d的石頭,而其他青蛙盡量跳,跳不過去了直接從1跳到n一定最優。所以只要判斷出最多可以讓多少只青蛙跳過去即可,二分即可。然而沒有開long long 100 0。暴力將伯努利數代入即可。前兩天做了一道插值讓我一直以為這道題是插值,然而...

省選模擬104 題解

a.簽到題 把每個點向它右側比他大的第乙個點之間連邊,如果沒有那麼向 root 連邊。那麼可以構成一棵樹。特判一些情況之後,可以認為問題就是 1.給某節點和它的所有兒子節點權值加上乙個值。2.詢問一條路徑的權值和。首先考慮如果只詢問單點的維護方法,其實就是打乙個標記表示給整個兒子集合都加上了若干權值...

省選模擬102 題解

a.island 對於正負不同的情況,o n 列舉左側的位置然後計算。對於正負性相同的情況,把笛卡爾樹建出來,然後每次考慮跨過最小值的貢獻。分幾種情況 左右均不超過最小值,左右僅有乙個超過最小值,左右都超過最小值。然後順便統計上其中乙個端點為劃分點的貢獻。然後瘋狂的寫式子拆式子就沒了。做法挺簡單的,...