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