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

2021-07-26 10:50:50 字數 1251 閱讀 6974

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

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

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

6 1 2 3 4 3 5

3 1 2

3 5

2 62 2 4

**調了很多遍,re,發現是head陣列開小了,好氣哦

把詢問按照右端點從大到小排序,從右往左掃。若在當前的右端點以內,某個數是第一次出現,則此處種類+1,用樹狀陣列維護

head[i]記錄i從右往左第一次出現的位置,next[i]是i這個個位置上的數字下一次出現的位置

#include

#include

#include

#include

using namespace std;

int n,m,a[50005],head[1000005],next[50005],c[50005],res[200005];

struct node

q[200005];

bool cmp(node a,node b)

int lowbit(int

x)void add(int

pos,intx)}

int query(int

pos)

return res;

}int main()

else

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

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

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

int j=n,k=n;

while(j>=1)

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

res[q[i].id]=query(q[i].r)-query(q[i].l-1);

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

printf("%d\n",res[i]);

return

0;}

樹狀陣列 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 ...