HH的項鍊 樹狀陣列

2021-09-02 14:51:15 字數 1599 閱讀 7955

code

我洛谷部落格

點這裡某一段貝殼中,包含了多少種不同的貝殼?

最開始看見這道題時,沒有思路

但再看看,可以非常明了的發現這是乙個樹狀陣列ban題

設有一長為5的項鍊

1 2 3 2 1

然後 m = 3

1 52 5

1 3我的思路是這樣,由於要求的是種類數!= 求l 到 r 的個數

每種貝殼只能存乙個(不能反覆存)

也就是說必須刪去一些相同的貝殼刪除的不能影響求得答案

比如:上面的1 2 3 2 1,去重,用-1表示刪去的

1 2 3 -1 -1

如果像這樣,求 l=2,r=5時結果為2

而實際結果為3

所以我們得排個序,按r的公升序

否則update(i,1)且刪去前乙個

所以又需要乙個陣列glod來記錄前乙個貝殼的位址

便有了如下**

#include

#include

using

namespace std;

const

int maxn =

500001

;const

int num =

1000001

;int n,bit[maxn]

,pr[maxn]

,glod[maxn]

;int k[num]

;inline

void

read

(int

*x)while

(a >=

'0'&&a <=

'9')

if(f)

*x *=-

1;}class

tpublic

:bool

operator

<

(const t w)

const

int l,r,num;

void

update

(int

,int);

intsum

(int);

}a[maxn]

;void t::

update

(int index,

int delta)

int t::

sum(

int index)

intmain()

sort

(a +

1,a +

1+ m)

;int q =1;

for(i =

1;i <= a[m]

.r;i++

)else

while

(i == a[q]

.r)}

for(i =

1;i < m;i++

)printf

("%d\n"

,pr[i]);

printf

("%d"

,pr[m]);

return0;

}

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 的個數 每種貝殼只能存乙個 不...

2725 HH的項鍊(樹狀陣列)

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