日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[CTSC2008]图腾totem

發布時間:2023/11/29 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [CTSC2008]图腾totem 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(圖騰這題做的我頭疼 233)

記 f(xxxx) 為 xxxx 出現的次數,那么題目就是要求 f(1324) - f(1243) - f(1432)

最有難度的是把上面的式子轉化一下,變成 f(1x2x) - f(14xx) - f(12xx) + f(1234)

這點除非對 f 的求法能一眼看出來,否則很難想到

后兩個比較簡單一點

f(1234) 可以想到用動規求

具體來講,設 dp[i][j] (i≤n, 1≤j≤4) 表示第 i 個數后面接 j 個上升序列

這樣轉移就是 dp[i][j] = dp[k][j] + dp[k][j-1],其中 k 是一個滿足 a[i] < a[k],i < k 的下標,k 可以用線段樹求

然后就是求 f(12xx)了

利用類似的求法,首先維護一下每個點右邊有多少點大于自己,這點用樹狀數組即可

然后維護一下上面的前綴和,這樣就可以計算 f(12xx) 了

也就是用兩層樹狀數組

至于 f(1x2x) 的求法理解起來并不難

按照高度從小到大把每個點放到原序列中去,不妨設當前點是 2

可以確定空位置比當前點大,而且當前點比之前放入的點大

那么為了使用計數原理需要求出空位置的數量

既然之前的點都比當前點小,假設左邊點的下標集合為 S,當前點為 j

對于 S[i],我們希望知道 S[i] 到 j 有多少空位置

聯想到區間和,又可以用樹狀數組啦

當然 |S| 可能會很大,既然這樣干脆再套一層樹狀數組得了

這樣就求出 f(1x2x) 了

f(14xx) 就變得玄學一點了

?利用類似上面的思想,把原序列從左到右放入一個排好序的序列

假設當前的是 4,那么排序序列里 4 左邊的數都是 1

中間的空白就是原序列后面的 xx

然后假設 1 的下標是 i,4 的下標是 j,需要求 (j-i) * (j-i-1) / 2

也就是 (j-i) * (j-i) - (j-i)

令 r[i] 表示下標為 i 的數右邊空白的數量

那么上面的式子就是 (r[i] - r[j]) ^ 2 - (r[i] - r[j])

拆開, r[i] ^ 2 + r[j] ^ 2 - 2 * r[i] * r[j] - (r[i] + r[j])

考慮左邊的所有 1,那么要求的就是 sum { r[i] ^ 2 - r[i] } - sum { r[i] } * r[j] * 2 + ( r[j] ^ 2 - r[j] ) * ( #1 )

于是維護 r 與 r ^ 2 的區間和就好了

這題就這樣解決啦

轉載于:https://www.cnblogs.com/HailJedi/p/9302278.html

總結

以上是生活随笔為你收集整理的[CTSC2008]图腾totem的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。