HH的項鍊 樹狀陣列

2022-05-07 21:57:15 字數 1299 閱讀 4966

我csdn部落格

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

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

但再看看,可以非常明了的發現這是乙個樹狀陣列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 t

public:

bool operator <(const t w) const

int l,r,num;

void update(int,int);

int sum(int);

}a[maxn];

void t::update(int index,int delta)

int t::sum(int index)

int main()

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]);

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 也就是說所處位置...

2725 HH的項鍊(樹狀陣列)

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