樹狀陣列操作

2022-06-01 21:12:09 字數 1195 閱讀 2795

題意:序列\(n <= 1e6\),有\(m <= n\)個詢問,求\(l\)到\(r\)中有幾個不相同的數。

題解:如果\(n\)的範圍為\(1e5\)就是莫隊裸題,但是由於\(n\)的範圍為\(1e6\)那麼就是可用樹狀陣列操作,具體就是可發現,只有最後出現的數字有價值,設\(r\)指標從左到右,如果出現了乙個數之前沒出現過,在樹狀陣列裡此位置\(+1\),如果當前\(r\)的數出現過,那麼就是之前的位置在樹狀陣列中\(-1\),然後新的位置\(+1\),然後詢問的話,就是\(sum(r)-sum(l-1)\)就是區間\([l,r]\)的不同數的數量

**:

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

typedef long long ll;

const int n = 1000010, m = 1000010, s = 1000010;

ll lowbit(ll x)

int n;

struct bit return ret;}

void add(ll pos, ll add)

}bit;

int a[n];

struct query q[m];

ll ans[n];

bool cmp(query a, query b)

signed main()

int m;scanf("%d", &m);

for (int i = 1; i <= m; i++) ;

} sort(q + 1, q + 1 +m, cmp);

// for (int i = 1; i <= m; i++)

for (int i = 1, j = 1; i <= m; i++) else

//cout << bit.ask(j) << endl;

j++;

} //cout << l << "->" << r << endl;

// for (int ii = 0; ii <= n; ii++)

ans[id] = bit.ask(r) - bit.ask(l-1);

// cout << "ans" << " " << ans[id] << endl;

} for (int i =1; i <= m; i++)

return 0;

}

樹狀陣列基本操作

今天剛剛接觸數壯陣列,大概的原理是理解了,不過理解的不是很透徹,也就是知其然,不知其所以然.所以把數狀陣列的基本操作暫時先記錄下來.等以後理解透徹之後在進一步的總結整理.分兩中情況討論 一.每次修改的是區間上的某個點,所求的是關於某個區間.第乙個函式 int low bit int x 這個函式主要...

樹狀陣列 數列操作

題目描述 給定n個數列,規定有兩種操作,一是修改某個元素,二是求子數列 a,b 的連續和。數列的元素個數最多10萬個,詢問操作最多10萬次。輸入第一行2個整數n,m n表示輸入n個數列,m表示有m個操作 第二行輸入n個數列。接下來m行,每更好行有三個數k,a,b k 0表示求子數列 a,b 的和,k...

樹狀陣列的操作(持續更新?)

樹狀陣列感覺就是快速求字首和的資料結構。以下記錄本人遇到的各種樹狀陣列模板題 單點修改,區間查詢 nyoj 116 士兵殺敵 二 include define for a,b,c for int a b a c a int tree 1000005 int n,m int lowbit int x ...