zoukankan      html  css  js  c++  java
  • 有关莫队

    莫涛(队长)神犇发明的算法%%% %%%

    一种优秀的暴力

    用于对区间操作

    基本思路是有策略的通过移动区间左右端点来改变区间,使之从一个询问的区间变成另一个区间

    即通过[l,r]求得[l,r+1],[l,r-1],[l-1,r],[l+1,r]之列;

    既然莫队的思路是移动端点,自然地,我们希望移动尽量少

    于是,怎样少呢?

    我们先考虑,把询问按l端点排序,这样左端点最多移动n次(由于排序后的单调性),但右端点可能有n*n次移动(你又管不着她);

    这样的话,我们(好吧,其实是莫队)考虑折中一下:

    把整个数列分成√n块,记录每个询问区间的l在哪块上,然后按l的块编号右端点双关键字排序(块编号优先);

    这样有什么效率呢?

    我的理解是:

    对于所有r,她们的排列满足周期单调性(l属于同一块时,r单调增),

    所以,l属于同一块的r之间最多移动n次(当然实际上也不会这么多),

    那么r最多一共移动n√n次;

    对于l,她的最多移动次数显然比扫一遍数列(这是n次)

    那么考虑这个是谁贡献的呢?

    是所有互为逆序对的li,li+1贡献的,

    精确的,当效率最差时,每个相邻的逆序对(li,lj)对效率的负供应为2*(li-lj),

    意为从li移动到lj再移回来

    有趣的是:

    (li-lj)li,lj互为逆序对不超过√n

    然后一共也不过m个逆序对

    这样,l的移动最差是m√n级的;

    于是对于标算往往是nlogn甚至是nlog²n的题目,莫队n√n+m√n的最差效率也是优秀的(感觉常数大点??);

    优秀的其实是代码量吧

    当然,莫队适用的主要是可以由[l,r]快速求得[l,r+1],[l,r-1],[l-1,r],[l+1,r]的题目;

    当然,莫队往往不支持修改,(带修莫队?你常数写大点,她和n²暴力有什么区别)主要是我也不会

    这就是莫队啦

  • 相关阅读:
    高盛、沃尔玛 题做出来还挂了的吐槽
    amazon师兄debrief
    到所有人家距离之和最短的中点 296. Best Meeting Point
    问问题没人回答的情况怎么办终于有解了
    找名人 277. Find the Celebrity
    数组生存游戏 289. Game of Life
    547. Number of Provinces 省份数量
    428. Serialize and Deserialize Nary Tree 序列化、反序列化n叉树
    alias别名简介和使用
    面试官:线程池执行过程中遇到异常会发生什么,怎样处理? Vincent
  • 原文地址:https://www.cnblogs.com/nietzsche-oier/p/6523101.html
Copyright © 2011-2022 走看看