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

2021-07-14 16:10:10 字數 1254 閱讀 6959

#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(node a,node b)

{ if(a.l==b.l)

return a.r=1;i--)

next[i]=p[a[i]],p[a[i]]=i;

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

if(p[i])

update(p[i],1);

int q;

scanf("%d",&q);

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

scanf("%d%d",&que[i].l,&que[i].r),que[i].id = i;

sort(que+1,que+1+q,cmp1);

int l = 1;

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

{ while(l

description

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

input

第一行:乙個整數n,表示項鍊的長度。 第二行:n個整數,表示依次表示項鍊中貝殼的編號(編號為0到1000000之間的整數)。 第三行:乙個整數m,表示hh詢問的個數。 接下來m行:每行兩個整數,l和r(1 ≤ l ≤ r ≤ n),表示詢問的區間。

output

m行,每行乙個整數,依次表示詢問對應的答案。

sample input

61 2 3 4 3 5

31 2

3 52 6

sample output

2

24

hint

對於20%的資料,n ≤ 100,m ≤ 1000;

對於40%的資料,n ≤ 3000,m ≤ 200000;

對於100%的資料,n ≤ 50000,m ≤ 200000。

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

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

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

題目大意 給你乙個序列,求某區間出現不同的數的個數。貌似離線樹狀陣列是最好的解法 先把所有詢問掛在它們詢問的右端點上 然後從頭到尾遍歷這個序列,記錄這個位置的值上一次出現的位置 那麼,當遍歷到第i位時,如果a i 在之前出現過,就在它上一次出現的位置 1 這個操作的意義是,第i位已經有a i 了,那...

樹狀陣列 BZOJ1878 HH的項鍊

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