zoukankan      html  css  js  c++  java
  • # [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)))

  • 相关阅读:
    15-07-23 HTML--标签
    15-07-22 数据库--存储过程、触发器
    15-07-19数据库练习题答案
    15-07-17 数据库练习题
    15-07-20 数据库--索引视图编程
    15-07-17 数据库--高级查询
    c#语句
    SQL 触发器
    SQL 存储过程
    SQL 循环语句
  • 原文地址:https://www.cnblogs.com/hznumqf/p/15468220.html
Copyright © 2011-2022 走看看