区间上的点到点的hash(即判断区间中的点,位于第几区间)(更新待续中...)

来源:互联网 发布:java支付宝接口demo 编辑:程序博客网 时间:2024/05/22 05:27

首先若区间较小,可以开的下,直接开整个区间的数组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)这里将一个序列中的连续区间(区间不交叉)映射到第几区间的做法:
int hash_to_type(int x)  {      int y = lower_bound(type.begin(), type.end(), x) - type.begin();      return y;  }///      type.push_back(0);      for (int i = 1; i<= k; i++)      {          scanf("%d", &x);          type.push_back(x);          type[i] += type[i - 1];      }      sort(type.begin(), type.end());///     int type_x = hash_to_type(x);///int type_y = hash_to_type(y);///

2)动态更新


2.一个区间,不连续区间(区间不交叉)到点的映射
1)静态


2)动态更新 :
cf234E题(此题只要求查询点所在区间的边界
此题的区间并不大,可以开整个区间的数组hash,但是更新比较麻烦,需要区间更新。
用set保存0区间的做法,动态更新维护查询1区间时比较方便。
题目解法
注意:
1)set解法中的处理,同样要求整个区间不能太大
2)题目中的处理区间是1组成的区间,所以set中保存的是0做成的区间,则查找时可以查到1组成区间的边界
3)因为是set且保存的是0的位置,所以可以动态的更改其中的一些点
注:也可转化1的情况,在不连续区间之间的添加的区间,则变成连续区间,最后再处理即可。


1 0
原创粉丝点击