BZOJ 1878 HH的項鍊 樹狀陣列 離線

2022-03-26 00:12:16 字數 1129 閱讀 5457

題目大意:給你乙個序列,求某區間出現不同的數的個數。

貌似離線樹狀陣列是最好的解法

先把所有詢問掛在它們詢問的右端點上

然後從頭到尾遍歷這個序列,記錄這個位置的值上一次出現的位置

那麼,當遍歷到第i位時,如果a[i]在之前出現過,就在它上一次出現的位置-1

這個操作的意義是,第i位已經有a[i]了,那麼上一次出現a[i]的位置已經失去意義

接著在這個位置+1,更新last[a[i]]。差分操作用樹狀陣列維護

然後我們遍歷以這個位置為結尾的所有詢問,用樹狀陣列查字首和,因為在a[i]相同的位置不會重複打差分,所以query(r)-query(l-1)即為這個詢問的答案。

1 #include 2 #include 3 #include 4 #include 5

#define inf 0x3f3f3f3f

6#define ll long long

7#define n 500100

8#define maxn 1000000

9using

namespace

std;

10//

re11

intn,m,cte;

12int

a[n],head[n];

13int lst[n*2],sum[n*2

];14

struct

quesques[n];

17struct

edgeedge[n];

20void edge_add(int u,int

v)21

27int cmp1(ques s1,ques s2)

28int cmp2(ques s1,ques s2)

29void update(int x,int w)

30int query(int x)

3132

intmain()

3352

}53 sort(ques+1,ques+m+1

,cmp2);

54for(int i=1;i<=m;i++) printf("

%d\n

",ques[i].ans);

55return0;

56 }

樹狀陣列 BZOJ1878 HH的項鍊

hh有一串由各種漂亮的貝殼組成的項鍊。hh相信不同的貝殼會帶來好運,所以每次散步 完後,他都會隨意取出一段貝殼,思考它們所表達的含義。hh不斷地收集新的貝殼,因此,他的項鍊變得越來越長。有一天,他突然提出了乙個問題 某一段貝殼中,包含了多少種不同 的貝殼?這個問題很難回答。因為項鍊實在是太長了。於是...

樹狀陣列 BZOJ1878 HH的項鍊

hh有一串由各種漂亮的貝殼組成的項鍊。hh相信不同的貝殼會帶來好運,所以每次散步 完後,他都會隨意取出一段貝殼,思考它們所表達的含義。hh不斷地收集新的貝殼,因此,他的項鍊變得越來越長。有一天,他突然提出了乙個問題 某一段貝殼中,包含了多少種不同 的貝殼?這個問題很難回答。因為項鍊實在是太長了。於是...

BZOJ 1878 HH的項鍊(離線樹狀陣列)

includeusing namespace std const int maxn 1000000 500 const int maxm 200000 500 int c maxn a maxn int p maxn next maxn struct node que maxm bool cmp1 ...