• # [Codeforces Round #751](https://codeforces.com/contest/1601) C.Optimal Insertion 分治 ##


    Codeforces Round #751 C.Optimal Insertion 分治

    题意

    给定数组(a,b) 在数组(a)中按照任意顺序插入(b) 中所有元素

    [1leq n,mleq 10^6\ 1 leq a_i ,b_i leq 10^9 ]

    分析

    有性质:数组(b)必然在(a)中不降序排列,证明显然

    对于插入位置为(i)的数(x),对(a)产生的逆序对的贡献是$sum_{j < i}[a_j > x] + sum_{j > i}[a_j < x] $

    我们希望这个数最小

    [sum_{j < i}[a_j > x] + sum_{j > i}[a_j < x] = sum_{j < i}[a_j > x] + (n - i ) - (sum_{j leq n}[a_j > x] - sum_{j < i}[a_j > x]) =C - 2sum_{j < i}[a_j > x] - i ]

    其中(C)是常数,这意味着我们寻求此式最小,只需要求(sum_{j < i}[a_j > x] - i)最大

    于是考虑类似处理中位数的做法,把([a_j > x])(a_j)看成1,([a_j < x])(a_j)看成-1,否则看成0,只需找前缀最大

    于是可以用线段树维护前缀和,对每个(b)(O(log))时间内找到插入的位置,要动态维护-1,0,1的位置

    这里介绍题解的做法,注意到对于(b_i)的位置(pos_i),(pos_i)具有单调性,于是我们可以先找出(pos_{mid}) ,由单调性,对于(i < mid)(pos_i < pos_{mid}) ,右侧同理,于是只需要继续递归确定其他点的位置,这样二分下去,最多递归log层,复杂度(O((n+m)log(n+m)))

  • 相关阅读:
    《C#微信开发系列(2)-自定义菜单管理》
    《C#微信开发系列(1)-启用开发者模式》
    python多进程: multiprocessing Pool 和tqdm
    前端
    python 缓存
    python pymysql
    python paramiko模块
    Linux之TCPIP内核参数优化
    python进程、线程、协程、IO多路复用
    python socket
  • 原文地址:https://www.cnblogs.com/hznumqf/p/15468220.html
Copyright © 2020-2023  润新知