SPOJ DQUERY 線段樹查詢區間不同值

2021-09-27 04:30:31 字數 1056 閱讀 9157

題意:給定乙個序列,和許多區間,查詢不同區間內不同數的個數。

#include

#include

#include

#include

using namespace std;

const

int maxn =

30005

;const

int maxq =

2e5+5;

struct nnode[maxq]

;bool cmp

(n a, n b)

//pre表示當前位置的元素 前面是否有相同的元素 有就代表下標,無就是0

int sum[maxn]

, a[maxn]

, pre[maxn]

, n, q, ans[maxq]

;void

update

(int x,

int v)

}int

query

(int x)

return ans;

}int

main()

scanf

("%d"

,&q)

;for

(int i =

1; i <= q; i++

)sort

(node +

1, node +

1+ q, cmp)

;int now =1;

for(

int i =

1; i <= q; i++

)//將此位置的數 + 1

update

(now,1)

; now++;}

ans[node[i]

.id]

=query

(node[i]

.r)-

query

(node[i]

.l -1)

;}for(

int i =

1; i <= q; i++

)return0;

}

SPOJ D query 可持久化線段樹

題目描述 多次詢問乙個區間內不同數的數量。解題思路 乙個區間內存在相同的數,所以我們的線段樹就不能維護數,應該去維護下標?為什麼去維護下標呢,就算乙個數相同,但是它們的下標肯定是不同的,我們的線段樹維護下標存在的情況。如果區間內存在重複的數,意味著不同下標對應相同的數,如果我們記錄多個下標答案就會重...

線段樹查詢

對於乙個有n個數的整數陣列,在對應的線段樹中,根節點所代表的區間為0 n 1,每個節點有乙個額外的屬性max,值為該節點所代表的陣列區間start到end內的最大值。為segmenttree設計乙個query的方法,接受3個引數root,start和end,線段樹root所代表的陣列中子區間 sta...

SPOJ DQUERY 區間種類查詢

離線做法 列舉右端點r,右端點固定時,記錄最右邊第一次出現的數字為1,比如1 2 1 2 3,0 0 1 1 1 給定l,那麼l r區間數字種類的結果是 sum r sum l 1 把詢問按r從小到大排序,我們r 1時,維護的陣列只改變r 1為1,和r 1的數之前出現的位置變為0即可。kx incl...