【做題記錄】Ynoi2015 盼君勿忘
阿新 • • 發佈:2022-01-17
- \(\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)\)。