题目描述
思路
某一段贝壳中,包含了多少种不同的贝壳?
最开始看见这道题时,没有思路
但再看看,可以非常明了的发现这是一个树状数组ban题
设有一长为5的项链
1 2 3 2 1
然后 m = 3
1 5
2 5
1 3
我的思路是这样,由于要求的是种类数 != 求l 到 r 的个数
每种贝壳只能存一个(不能反复存)
也就是说必须删去一些相同的贝壳且删除的不能影响求得答案
比如:上面的1 2 3 2 1,去重,用-1表示删去的
1 2 3 -1 -1
如果像这样,求 l=2,r=5时结果为2
而实际结果为3
所以我们得排个序,按r的升序
遍历i,当i所在位置贝壳前面没有时,update(i,1)
否则update(i,1)且删去前一个
所以又需要一个数组Glod来记录前一个贝壳的地址
便有了如下代码
code
#include <cstdio>
#include <algorithm>
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)
{
*x = 0;
char a = getchar();
bool f = 0;
while(a < '0'||a > '9') {
if(a == '-') f = 1;a