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)))

  • 相关阅读:
    IDE有毒
    Netbeans 8.2关于PHP的新特性
    什么是人格
    谁该赋予一款产品灵魂?
    自从升级到macOS后,整个人都不好了
    公司不是大家庭
    性能各个指标分析
    Sqlserver2012 alwayson部署攻略
    初探Backbone
    SQL Server AlwaysOn架构及原理
  • 原文地址:https://www.cnblogs.com/hznumqf/p/15468220.html
Copyright © 2011-2022 走看看