——-
对于每一个$a[i]$可以记录它上一次出现的位置;
$1.$可以用树状数组解(离线):对询问排序(询问的$r$从小到大),右指针移动则$add(R,1)$,然后对$a[R]$上一次出现的位置$add(pos,-1)$,对于一个询问则是$query(r)-query(l-1)$;
$2.$可以主席树记录原数组下标方式解(在线):对于新加入的$a[i]$,在$i$这个位置$+1$,在$a[i]$上一次出现的位置$-1$,对于主席树的每一棵树$p[root]$就是$[1,r]$的种类数,对于每一个询问$[l,r]$,就是先得知插入$r$的版本号$root$,在这一棵树上求$[l,r]$的权值和;
$3.$可以主席树记录权值(在线):对于每一个元素$a[i]$,记录这个元素下一次出现的位置$aft[i]$,对$aft[i]$建立主席树,此时问题就变成在$[l,r]$范围内查找大于$r$的数字个数。对于新加入的一个$aft[i]$,新建树链在$aft[i]$这个权值点$++$,询问就是普通主席树询问方式;
方式一
$1.$可以用树状数组解(离线):对询问排序(询问的$r$从小到大),右指针移动则$add(R,1)$,然后对$a[R]$上一次出现的位置$add(pos,-1)$,对于一个询问则是$query(r)-query(l-1)$;
1 |
|
方式二
$2.$可以主席树记录原数组下标方式解(在线):对于新加入的$a[i]$,在$i$这个位置$+1$,在$a[i]$上一次出现的位置$-1$,对于主席树的每一棵树$p[root]$就是$[1,r]$的种类数,对于每一个询问$[l,r]$,就是先得知插入$r$的版本号$root$,在这一棵树上求$[l,r]$的权值和;
1 |
|
方式三
$3.$可以主席树记录权值(在线):对于每一个元素$a[i]$,记录这个元素下一次出现的位置$aft[i]$,对$aft[i]$建立主席树,此时问题就变成在$[l,r]$范围内查找大于$r$的数字个数。对于新加入的一个$aft[i]$,新建树链在$aft[i]$这个权值点$++$,询问就是普通主席树询问方式;
1 |
|