題意:求
\[\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,區間修改區間查詢 還是利用差分的...