題意:給定乙個序列,和許多區間,查詢不同區間內不同數的個數。
#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...