1. 程式人生 > 其它 >【做題記錄】Ynoi2015 盼君勿忘

【做題記錄】Ynoi2015 盼君勿忘

  • \(\text{Ynoi2015}\) 盼君勿忘

題目:

一個序列,每次查詢給定 \(l,r,p\),求區間 \([l,r]\) 中所有子序列分別去重後的和 \(\bmod\ p\)

\(n\le 10^5\)


題解:

去重轉化成貢獻。

對於在區間 \([l,r]\) 中的一個值 \(x\) 出現 \(k\),則其貢獻為 \(x(2^{r-l+1}-2^{r-l+1-k})\)

所以對於 \(S_k\) 表示所有出現次數為 \(k\) 的數的和,區間總貢獻為 \(\displaystyle \sum_{i=1}^{r-l+1}S_i(2^{r-l+1}-2^{r-l+1-i})\)

考慮如何去在轉移中計算 \(S_k\)

直接用莫隊去統計,但是如果直接如上述式子中列舉 \(k\) 效率退化,考慮如何快速取出所有滿足條件的 \(k\)

考慮一種支援插入,刪除,遍歷的資料結構,那麼顯然可以使用連結串列或者 unorded_map 來維護 \(k\)

對於 \(2^{r-l+1}-2^{r-l+1-k}\) 直接光速冪,\(O(\sqrt n)\) 的預處理算出 \(pw1_i=2^i,pw2_i=2^{i\sqrt n}(1\le n\le \sqrt n)\) 直接做到 \(O(1)\) 查詢。

總時間複雜度 \(O(n\sqrt m+m\sqrt n)\),空間複雜度 \(O(n+m)\)