1. 程式人生 > 其它 >LGP6144口胡

LGP6144口胡

衝了50分鐘外加10分鐘廁所才衝出來,請問我還有救嗎。

還是考慮像弱化版那樣按照左端點排序,並且記錄答案的 \(0\sim k\) 次冪和。

然後考慮新增的貢獻。仍然是右端點不超過自身構成的貢獻。但是我們將這部分寫成一個集合 \(|S|\),我們在這裡約定後面列舉的 \(x\) 都屬於這個 \(|S|\)。那麼貢獻就是 \(\sum(x+1)^k=\sum_{i=0}^k\binom{k}{i}\sum x^k\)

這一部分很平凡,但是我們應該怎麼維護貢獻呢。。。

我們只要把這一部分線段拉出來做一遍原問題不就好了

考慮將這些線段丟到一個序列上,按照左端點排序。(別忘了右端點是不超過某個值的)

假設對於第 \(i\)

條線段,多出的貢獻是 \(f_i\),那麼這一車線段的答案應該是 \(\sum_{i=1}^m2^{m-i}f_i=2^m\sum_{i=1}^m\frac{f_i}{2^i}\)

然後是加入一條新的線段。

首先先把這條線段的貢獻直接丟到序列上。

這條線段的貢獻是不是“右端點不大於最外層列舉線段左端點且不大於自身左端點的線段”構成個集合的貢獻?

看一眼,好像就是最外層問題的貢獻啊?直接插進來。

對於自身對其他線段的貢獻,找到右端點,然後在序列上二分出一個字尾,滿足這些字尾的左端點都比加入的新線段大。

然後讓這個字尾的貢獻全部加上“自身貢獻+1”就行了。

分母的 \(2\) 的冪,每次再把字尾乘上 \(2\)

的逆元就好了。

然後怎麼把這些線段放到正確的位置上,只需對右端點排序就行了。

複雜度 \(O(k^2n+kn\log n)\),可以通過。