2018年8月3日训练笔记

       今天再看昨天多校题,认真写了A,F两题,A一道01分数规划昨天看完了知识点,今天敲了代码,又看了分数规划其他题型可是看不懂,只是了解到分数规划可以在树上规划,然后F题一道树状数组求数学期望感觉不错的题目就认真补了补,又在讨论区看了其它一些题目的题解,了解了一下思路,但都没有认真补,这套题大量用到了树状数组线段树,越来越发现这两个算法不简单。下午看了看前天多校的题目,主要是为了补莫队算法的那道题,先是主要看了一些莫队算法的博客,一些模板题的套路倒是看明白了,然后补了那道杭电多校4的B题,莫队算法求组合数之和。

 

  • 莫队算法

基本莫队:莫队就是先将所有区间查询离线,同过对区间[L,R]的查询转移到[L - 1, R]、[L + 1, R]、[L, R - 1]、[L, R + 1]来优化时间,而这里最好要有较快的算法实现转移(要查询的区间之间的转移是很暴力的)。对查询区间的排序是先按照区间左端点所在的blockID=:floor(L/n)升序排,再按照R升序排。其中blockID是指按输入将n个查询分为sqrt(n)个块,区间左端点在哪个块。

即对于排好序的查询区间我们在求出前一个查询[Li,Ri]之后,我们可以通过区间两端一步一步的转移求出[Li+1,Ri+1],这里优化之处在于对查询区间的排序。

莫队算法注意erase在前,insert在后。insert总是使用前缀自增自减运算符[--L][++R],erase总是用后缀运算符;

 时间复杂度(以下来自:https://www.cnblogs.com/CsOH/p/5904430.html):

  •        还有一个问题,为什么分块要分成√n块呢?我们分析一下时间复杂度。
  •   假设我们每k个点分一块。
  •   如果当前询问与上一询问左端点处在同一块,那么左端点移动为O(k)。虽然右端点移动可能高达O(n),但是整一块询问的右端点移动距离之和也是O(n)(想一想,为什么)。因此平摊意义下,整块移动为O(k) × O(k) + O(n),一共有n / k块,时间复杂度为O(kn + n2 / k)。
  •   如果询问与上一询问左端点不处于同一块,那么左端点移动为O(k),但右端点移动则高达O(n)。幸运的是,这种情况只有O(n / k)个,时间复杂度为O(n + n2 / k)。
  •   总的移动次数为O(kn + n2 / k)。因此,当k = √n时,运行时间上界最优,为O( n1.5 )。
  •   最后,因此根据每次insert和erase的时间复杂度,乘上O(1)或者O(logn)亦或O(n)不等,得到完整算法的时间复杂度(代码使用了map,为O( logn ))。

 

链接https://www.cnblogs.com/CsOH/p/5904430.html

           https://blog.sengxian.com/algorithms/mo-s-algorithm

           https://blog.csdn.net/thinfatty/article/details/72581276

           https://wenku.baidu.com/view/18b86cdc763231126fdb114f.html?from=search

           https://www.cnblogs.com/Paul-Guderian/p/6933799.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值