首先若区间较小,可以开的下,直接开整个区间的数组hash,
1)静态查询:
node保存区间节点信息,直接查询hash的node的id即可
2)动态更新,点查询:
node保存区间节点信息
查询时,同样直接查询hash的node 的id即可
更新时比较麻烦,但也可以实现(可用树状数组,线段树维护)
下面是处理不能直接开整个区间数组hash的情况
1.静态查询
Vector 或 MAP
node保存区间节点信息
(1)计算区间的右边界,插入vector,二分查找,判断第几区间即可。
(2)计算区间的右边界,插入map。
注:不能用set,因为无法判断set中元素的名次。但是可以用平衡树treap等实现,不过就比较麻烦了。
2.动态更新点,查询点
MAP
node保存区间节点信息
计算区间的右边界,插入map,对应node的id。
更新时,计算更改的区间,先删除,在插入。
注:
1)不能用set,原因同1。
2)下面第二个例子的用法,同样需要更新,但是只要查询点所在区间的范围,用set的做法很简单。
例子:
1.一个区间的连续子区间(区间不交叉)到点的映射
1)静态:cf234 D题(此题没有要求动态更新)
D. Dima and Bacteria
题目有两种做法,并查集+floyd和搜索+floyd
搜索+floyd(判断时注意种类内可通过种类间来转移能量):
1)静态查询:
node保存区间节点信息,直接查询hash的node的id即可
2)动态更新,点查询:
node保存区间节点信息
查询时,同样直接查询hash的node 的id即可
更新时比较麻烦,但也可以实现(可用树状数组,线段树维护)
下面是处理不能直接开整个区间数组hash的情况
1.静态查询
Vector 或 MAP
node保存区间节点信息
(1)计算区间的右边界,插入vector,二分查找,判断第几区间即可。
(2)计算区间的右边界,插入map。
注:不能用set,因为无法判断set中元素的名次。但是可以用平衡树treap等实现,不过就比较麻烦了。
2.动态更新点,查询点
MAP
node保存区间节点信息
计算区间的右边界,插入map,对应node的id。
更新时,计算更改的区间,先删除,在插入。
注:
1)不能用set,原因同1。
2)下面第二个例子的用法,同样需要更新,但是只要查询点所在区间的范围,用set的做法很简单。
例子:
1.一个区间的连续子区间(区间不交叉)到点的映射
1)静态:cf234 D题(此题没有要求动态更新)
D. Dima and Bacteria
题目有两种做法,并查集+floyd和搜索+floyd
搜索+floyd(判断时注意种类内可通过种类间来转移能量):