題目大意:給你乙個序列,求某區間出現不同的數的個數。
貌似離線樹狀陣列是最好的解法
先把所有詢問掛在它們詢問的右端點上
然後從頭到尾遍歷這個序列,記錄這個位置的值上一次出現的位置
那麼,當遍歷到第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 ...