洛谷 P1972 HH的項鍊(樹狀陣列,排序)

2021-09-28 17:01:12 字數 1115 閱讀 2649

題目大意:

已知一串數字an,有m個詢問,每個詢問包含乙個區間[a,b],問你an在區間[a,b]中有多少個不同的數。

解題思路:

我們把每個詢問的右區間進行排序,每次我們對樹狀陣列進行更新,怎麼更新呢?對於重複出現的數字,我們只記錄最後一次出現位置,並在對應位置打1(注意:這裡不是對樹狀陣列打1,樹狀陣列本質上是對乙個普通陣列求和的維護,所以我們這裡是對普通陣列對應位置打1),之前打過1的位置清零。其它沒出現過的數字就放0好了。什麼時候更新呢?每次當詢問區間的右邊界往右移動的時候就開始更新,看是否有重複的數字或者第一次出現的數字。當詢問區間排好序,並且詢問的時候,我們是不用關心重複出現的靠左邊的數字,這樣做的好處是:我們將不同的數字,可以轉化為區間求和問題!比如問[1,3]不同的數字,我們就可以認為是對[1,3]區間進行求和!

廢話:(1)這裡使用了對詢問排序這種預處理的思想可以學習。

(2)這種轉換為對區間求和的思想可以學習。

#include #define lsone(n) n&(-n)

using namespace std;

vector> range;

vector> rgh_no;

const int maxn=1e6+10;

int flag[maxn];

int ansarr[maxn];

class fenwickedtree

void adjust(int idx,int val)

} int getsum(int a,int b)

int getsumuntill(int a)

return sum;

}};int main()else

}poi=rgh_no[i].first;

} int lf=range[rgh_no[i].second].first;

int rg=range[rgh_no[i].second].second;

int ans=ft.getsum(lf,rg);

ansarr[rgh_no[i].second]=ans;

} for(int i=0;i<(int)rgh_no.size();i++)

return 0;

}

洛谷P1972 HH的項鍊 樹狀陣列

題目 題意 給定乙個長度為n的序列,數字表示珠子的種類。m次查詢每次詢問給定區間內珠子的種類數。思路 可以說是運用了字首和的思想吧。從前到後的去處理查詢,而對於某乙個查詢區間,如果某乙個種類出現了多次的話我們只需要計算最後一次出現。用query x 表示1 x區間內的種類數,其中對每個種類我們只標記...

樹狀陣列 洛谷 P1972 HH的項鍊

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

洛谷 P1972 HH的項鍊

題意 查詢某一區間顏色數 思路 對於固定區間來說,顏色數隻與各種顏色第一次出現的位置有關。該位置置1,該顏色其餘位置置0.include using namespace std typedef long long ll typedef pairpii typedef pairpiii const l...