HH的項鍊(樹狀陣列)區間內不同的數量

2021-08-08 22:26:49 字數 1246 閱讀 6961

hh有一串由各種漂亮的貝殼組成的項鍊。hh相信不同的貝殼會帶來好運,所以每次散步 完後,他都會隨意取出一

段貝殼,思考它們所表達的含義。hh不斷地收集新的貝殼,因此他的項鍊變得越來越長。有一天,他突然提出了一

個問題:某一段貝殼中,包含了多少種不同的貝殼?這個問題很難回答。。。因為項鍊實在是太長了。於是,他只

好求助睿智的你,來解決這個問題。

input

第一行:乙個整數n,表示項鍊的長度。 

第二行:n個整數,表示依次表示項鍊中貝殼的編號(編號為0到1000000之間的整數)。 

第三行:乙個整數m,表示hh詢問的個數。 

接下來m行:每行兩個整數,l和r(1 ≤ l ≤ r ≤ n),表示詢問的區間。

n ≤ 50000,m ≤ 200000。

output

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

sample input

6

1 2 3 4 3 5

31 2

3 52 6

sample output

2

24

hint

題意:有一串項鍊,每點有個顏色,給你個區間。查詢這個區間內有幾種不同的顏色?

思路:預處理出上乙個與i顏色相同的點pre[i],將詢問按右端點排序,然後一邊往樹狀陣列進入點一邊處理詢,注意其中一些小技巧。

**:

#include #include #include #include using namespace std;

int n,m,sum;

const int maxn=1000010;

int pre[maxn],s[maxn],p[maxn],head[maxn],ans[maxn];

struct q

q[maxn];

bool cmp(q a,q b)

return res;

}int main()

scanf("%d",&m);

for(i=1;i<=m;i++) scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;

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

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

for(i=1;i<=m;i++) printf("%d\n",ans[i]);

return 0;

}

多看 多學 多想

HH的項鍊 樹狀陣列

code 我洛谷部落格 點這裡某一段貝殼中,包含了多少種不同的貝殼?最開始看見這道題時,沒有思路 但再看看,可以非常明了的發現這是乙個樹狀陣列ban題 設有一長為5的項鍊 1 2 3 2 1 然後 m 3 1 52 5 1 3我的思路是這樣,由於要求的是種類數 求l 到 r 的個數 每種貝殼只能存乙...

HH的項鍊(樹狀陣列)

由於詢問的是區間中貝殼的種類數,所以問詢區間中相同種類的貝殼只有乙個會起作用 將i位置的貝殼前一次出現的位置記作pre i 種類為x的貝殼最後一次出現的位置記作f x 類似於鄰接表的nxt和had,利用pre i f x f x i來處理pre 對於每個詢問 l,r 只有pre i 也就是說所處位置...

HH的項鍊 樹狀陣列

我csdn部落格 點這裡某一段貝殼中,包含了多少種不同的貝殼?最開始看見這道題時,沒有思路 但再看看,可以非常明了的發現這是乙個樹狀陣列ban題 設有一長為5的項鍊 1 2 3 2 1 然後 m 3 1 52 5 1 3我的思路是這樣,由於要求的是種類數 求l 到 r 的個數 每種貝殼只能存乙個 不...