加载中...

3.20——edu159D

edu159 D

限时每日一题day17。代码量本应很小的一道题,用火箭冲过去了(雾

可以将二维点哈希映射为一个数。这里我用的哈希函数是:

\[HASH(x, y) = (2n + 1) x + y \]

这样可以保证在 \(x \in [-n,n], y \in [-n,n]\) 范围内的任意 \((x, y)\) 的哈希映射均不同,没有哈希冲突。

对原序列的每个位置所到达的点,对横坐标与纵坐标分别处理出前缀和与后缀和(后缀和是为了方便检验翻转区间)。对于区间 \([l, r]\) 的翻转,原序列中 \([1, l - 1]\)\([r + 1, n]\) 所到达的位置是不受翻转影响的,可以直接查原序列对应位置是否存在查询点。而对于翻转区间,可以进一步利用后缀和加工处理,来查原序列对应位置是否存在查询点。

这样,问题就转化为了查询给定区间内是否存在某个 \((x,y)\)。而前面的哈希映射将 \((x,y)\) 映射成了数,那么问题又简化为了查询给定区间是否存在某个数。这个我赛时直接上主席树了,实际上直接对每个出现过的哈希值在 \(map<int,vector<int>>\) 上二分位置就可以了。具体细节见代码。

code

posted @ 2025-03-20 16:58  jxs123  阅读(6)  评论(0)    收藏  举报