洛谷P1972 HH的項鍊 樹狀陣列

2022-06-26 03:09:15 字數 1666 閱讀 3610

題目

題意:給定乙個長度為n的序列,數字表示珠子的種類。m次查詢每次詢問給定區間內珠子的種類數。

思路:可以說是運用了字首和的思想吧。從前到後的去處理查詢,而對於某乙個查詢區間,如果某乙個種類出現了多次的話我們只需要計算最後一次出現。

用query(x)表示1~x區間內的種類數,其中對每個種類我們只標記最後一次出現。也就是說順序遍歷的時候如果又出現了就把前面的清空,標記當前位置。

如果查詢的區間是l~r那麼答案就是query(r) - query(l - 1)。

所以首先需要把查詢按照右端點從小到大排序。每次只需要更新上一次右端點到這一次右端點這一段區間,同時要標記每乙個種類最近一次出現的位置,用於清空。

1 #include2 #include3 #include4 #include

5 #include6 #include7 #include8 #include9 #include10 #include11 #include12

13#define inf 0x3f3f3f3f

14using

namespace

std;

15 typedef long

long

ll;16 typedef pairpr;

1718

intn, m;

19const

int maxn = 5e5 + 5;20

struct

nodeq[maxn];

23int

neck[maxn];

24int sum[maxn << 2

];25

const

int maxnum = 1e6 + 5;26

intpos[maxnum];

2728

bool

cmp(node a, node b)

2932

33bool

cmp1(node a, node b)

3437

3839

void add(int rt, int

val)

4045}46

47int query(int

rt)48

54return

ans;55}

5657

intmain()

5863 scanf("

%d", &m);

64for(int i = 0; i < m; i++)

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

6970

int nxt = 1;71

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

77 add(j, 1

);78 pos[neck[j]] =j;79}

80 nxt = r + 1

;81 q[i].ans = query(q[i].r) - query(q[i].l - 1

);82

}83 sort(q, q +m, cmp1);

84for(int i = 0; i < m; i++)

87return0;

88 }

樹狀陣列 洛谷 P1972 HH的項鍊

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

洛谷 P1972 HH的項鍊

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

洛谷P1972 HH的項鍊

傳送門啦 分析 題目描述不說了,大意是,求一段區間內不同元素的種數。看到區間,我們大概先想到的是暴力 然後炸掉 線段樹 樹狀陣列 分塊。下面給出的是一種樹狀陣列的想法。首先,對於每一段區間裡的數,如果出現重複的元素,我們只需要看最後乙個就好了。所以,我們可以對所有需要查詢區間的右端點進行從小到大的排...