題意:序列\(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 ...