D 區間求和 數學 樹狀陣列

2022-04-06 19:37:28 字數 1030 閱讀 6913

題意:求

\[\sum_^n \sum_^ \sum_^n 區間前k大值和

\]比賽時因為被b卡了沒有深入想這道題 結果b沒做出來後面的題也沒做

化一下式子

\[\begin

&= \sum_^n \sum_^n \sum_^r a_k \cdot (1+\sum_^r [a_i < a_k]) \\

&考慮乙個數的貢獻 \\

&= \sum_^n \sum_^n a_k \cdot [a_i < a_k] \cdot k \cdot (n-i+1)\\

&+ \sum_^n \sum_^ a_k \cdot [a_i < a_k] \cdot i \cdot (n-k+1) \\

&+ \sum_^n a_k \cdot k \cdot (n-k+1)

\end

\]簡單的二維偏序問題,樹狀陣列搞一下就行了

注意數相等的情況!第二個二維偏序把相等認為是大於就行了

一定要考慮這種做題方法:

把一些最大值、最小值、k大值之類的關係用求和式子表示出來進行化簡

#include #include #include #include #include using namespace std;

typedef long long ll;

const int n = 1e6+5, mo = 1e9+7;

inline int read()

while(c>='0'&&c<='9')

return x*f;

}int n, a[n], mp[n]; ll a, b, c;

ll c[n];

inline void mod(ll &x)

inline void add(int p, ll v)

inline ll sum(int p)

void solve()

int main()

樹狀陣列 區間求和

樹狀陣列 是乙個查詢和修改複雜度都為log n 的資料結構,假設陣列a 1.n 那麼查詢a 1 a n 的時間是 log n 級別的。所以如果要解決 陣列中的元素不斷被修改,怎麼才能快速地獲取陣列中連續m個數的和 這個問題的話,用樹狀陣列就再好不過了 首先,什麼是樹狀陣列呢?樹狀陣列就是用另外乙個陣...

CF301D(樹狀陣列,離線統計,區間求和)

cf 301d 題目大意 一段序列 只包含1 n 乙個數如果是另乙個數 包括本身 的因子則成為一對,求某個區間內的對數 大概思路 記錄每個數的位置 離線操作 i從左往右掃一遍,判斷a i j 1 j n a i 的位置p,如果p i,則在i位置上加一 如果p i,則在p位置上記錄i,當再次掃到p時在...

樹狀陣列的區間修改求和

差分陣列 c i a i a i 1 然後可以發現 a i a 1 a 2 a 1 a 3 a 2 a i a i 1 c 1 c 2 c i 1,區間修改單點查詢 修改a l 到a r 值 的時候,只需修改c l 和c r 1 然後求一次c i 的字首和就可以。2,區間修改區間查詢 還是利用差分的...