code
我洛谷部落格
點這裡某一段貝殼中,包含了多少種不同的貝殼?
最開始看見這道題時,沒有思路
但再看看,可以非常明了的發現這是乙個樹狀陣列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
tpublic
:bool
operator
<
(const t w)
const
int l,r,num;
void
update
(int
,int);
intsum
(int);
}a[maxn]
;void t::
update
(int index,
int delta)
int t::
sum(
int index)
intmain()
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]);
return0;
}
HH的項鍊(樹狀陣列)
由於詢問的是區間中貝殼的種類數,所以問詢區間中相同種類的貝殼只有乙個會起作用 將i位置的貝殼前一次出現的位置記作pre i 種類為x的貝殼最後一次出現的位置記作f x 類似於鄰接表的nxt和had,利用pre i f x f x i來處理pre 對於每個詢問 l,r 只有pre i 也就是說所處位置...
HH的項鍊 樹狀陣列
我csdn部落格 點這裡某一段貝殼中,包含了多少種不同的貝殼?最開始看見這道題時,沒有思路 但再看看,可以非常明了的發現這是乙個樹狀陣列ban題 設有一長為5的項鍊 1 2 3 2 1 然後 m 3 1 52 5 1 3我的思路是這樣,由於要求的是種類數 求l 到 r 的個數 每種貝殼只能存乙個 不...
2725 HH的項鍊(樹狀陣列)
題目描述 hh有一串由各種漂亮的貝殼組成的項鍊。hh相信不同的貝殼會帶來好運,所以每次散步完後,他都會隨意取出一段貝殼,思考它們所表達的含義。hh不斷地收集新的貝殼,因此,他的項鍊變得越來越長。有一天,他突然提出了乙個問題 某一段貝殼中,包含了多少種不同的貝殼?這個問題很難回答。因為項鍊實在是太長了...