0
点赞
收藏
分享

微信扫一扫

【知识总结】扫描线+树状数组


问题引入:

给出个区间,问有多少对区间相交。

基本思路:

按照右端点排序后,从左往右扫,每次先询问再更新;
将右端点的值加,询问当前区间的和;
即单点修改区间查询,可以用树状数组维护。

题型总结:

大概用于:

  • 可以离线的区间查询问题
  • 枚举右端点,看符合条件的对应点的个数,同时要保证对于每一个右端点来说,合法的对应点的数量不宜超过
  • 问题可以转化为点对问题
  • 贡献比较好维护

例题:

CF301D.Yaroslav and Divisors

​​题解​​​ 算是比较入门的题,题目难度在于如果快速的求出每个数前面的因子的位置,由于因子最多有个,所以每个位置存储的数也最多为,整体时间复杂度

CF220B Little Elephant and Array

​​题解​​ 难点在于如何利用树状数组的差分原理来进行贡献的增加和消除,要多举例子。还用到了一个小的思维优化。

牛客 小乐乐学数学

​​题解​​ 需要对每个数进行质因子分解,这是难点一;难点二在于如何消除贡献,细节也比较多。

CF617E XOR and Favorite Number

​​题解​​​ 用这种解法是过不了的。其实离线树状数组跟莫队都是用于离线处理区间问题的,但是如果一个点有以上个配对的点时,时间复杂度就会被卡成,正如本题:如果序列中全为,那么对于每一个数,前面都有很多个符合要求的数,遍历一遍进行单点修改显然不可取,只好借助其他数据结构比如莫队啦。

总结:

大体流程就是:

  • 将所有询问离线保存,按照右端点排序;(左端点也可)
  • 枚举右端点,计算出加入右端点之后前面的数的贡献,同时消除重复的贡献,这里要结合树状数组的差分原理来理解,是题目中不好推的地方;
  • 对于每个右端点为当前点的询问,借助区间求和与前缀和求出答案并保存;
  • 输出答案;

一些有用的链接

  • Codeforces 220B 学长​​题解​​
  • Nowcoder-小乐乐学数学 宇巨​​题解​​
  • Codeforces 301D 学长​​题解​​

大概是一些进阶题?

反正是从光巨的博客里翻出来的~

  • AtCoder Beginner Contest 186F Rook on Grid​​题解​​
  • 【Nowcoder】 子串​​题解​​
  • Codeforces 483D​​题解​​

完结啦

暂时先这样了吧,明天补一下上面三道题。大概写的时候言语混乱+思绪不清,希望下次看这篇时还能看懂自己写的话。


举报

相关推荐

0 条评论