题目描述

涵涵有两盒火柴,每盒装有\(n\)根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum (a_i-b_i)^2$

其中\(a_i\) 表示第一列火柴中第\(i\)个火柴的高度,\(b_i\)表示第二列火柴中第\(i\)个火柴的高度。

每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 \(99,999,997\)取模的结果。

输入输出格式

输入格式:

共三行,第一行包含一个整数\(n\),表示每盒中火柴的数目。

第二行有\(n\)个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。

第三行有\(n\)个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。

输出格式

一个整数,表示最少交换次数对\(99,999,997\)取模的结果。

样例

INPUT

4
2 3 1 4
3 2 1 4

OUTPUT

1

INPUT

4
1 3 4 2
1 7 2 4

OUTPUT

2

HINT

【输入输出样例说明1】

最小距离是\(0\),最少需要交换\(2\)次,比如:交换第\(1\)列的前\(2\)根火柴或者交换第\(2\)列的前\(2\)根火柴。

【输入输出样例说明2】

最小距离是\(10\),最少需要交换\(2\)次,比如:交换第\(1\)列的中间\(2\)根火柴的位置,再交换第\(2\)列中后\(2\)根火柴的位置。

【数据范围】

对于\(10%\)的数据, \(1≤n≤10\)

对于 \(30%\)的数据,\(1≤n≤100\)

对于 \(60%\)的数据,\(1≤n≤1,000\)

对于 \(100%\)的数据,\(1 ≤ n ≤ 100,000,0≤\)火柴高度\(≤maxlongint\)

SOLUTION

离散+树状数组求逆序对

题目这个换来换去然后得到最小距离的要求很容易就让人想到有一道名为“多米诺骨牌”的dp题。但实际上并不一样,那道题是上下换,两个序列的组成很可能会改变很大,而且两题的数据范围等也存在差异,反正这题就不能用那种dp方法做。

本题的核心思路就是:若要使\(\sum (a_i-b_i)^2\)最小,每对\(abs(a_i-b_i)\)的对答案的贡献应该尽可能的少,然后就可以想到若是把\(a,b\)两个序列从小到大排序,然后得到的两个序列就能构成最优答案。那么怎么计算交换次数呢?我们根据未排序序列的\(a[i]\)与其所对应的\(b[i]\)位置来计算交换次数。

引用@ZJYelizaveta的题解部分内容:
"好了,这道题目的精华在于对于新建序列!

假设我们现在有离散化后的序列\(a = {4, 3, 1, 2}\),\(b = {1, 3, 2, 4}\)

我们令\(q[a[i]] = b[i]\),相当于以 \(a[i]\)为关键字对序列 b[i]b[i]b[i] 排序。

若序列 \(a\) 与序列\(b\)相等,那么此时\(q[a[i]]\)应该等于\(a[i]\)的,也就是\(q[i] = i\)。

那么也就是说如果我们想让序列\(a\)与序列\(b\)相等,那么我们需要让\(q\)升序排列。

问题就变为,将原本乱的\(q\)序列升序排列的最少交换次数。

诶,这不就是逆序对吗?

于是,用树状数组求之即可。
"

并且这里要注意:我们存在\(q\)里的\(c,d\)都代表的是\(a,b\)离散后的位置,因为我们的最优解只需要位置相对应就够了,不一定要求达到真正的\(a,b\)从小到大升序排列。这一点要十分注意!!!

Luogu_1966_火柴排队的更多相关文章

  1. Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对

    题目:http://codevs.cn/problem/3286/ 3286 火柴排队  2013年NOIP全国联赛提高组  时间限制: 1 s   空间限制: 128000 KB   题目等级 : ...

  2. 洛谷P1966 【火柴排队】

    题解 P1966 [火柴排队] 说明: 在数学中有个公式: (a1-b1)^2+(a2-b2)^2<(a2-b1)^2+(a1-b2)^2 (你可以自己试着证一下) 两列火柴对应的两根火柴在各列 ...

  3. [树状数组+逆序对][NOIP2013]火柴排队

    火柴排队 题目描述 涵涵有两盒火柴,每盒装有n根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑ (ai-bi)2,i=1,2,3,. ...

  4. 【刷题】洛谷 P1966 火柴排队

    题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...

  5. [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)

    [NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...

  6. LOJ2609. NOIP2013 火柴排队 【树状数组】

    LOJ2609. NOIP2013 火柴排队 LINK 题目大意: 给你两个数列,定义权值∑i=1(ai−bi)^2 问最少的操作次数,最小化权值 首先需要发现几个性质 最小权值满足任意i,j不存在a ...

  7. 洛谷 P1966 火柴排队 解题报告

    P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: \(\s ...

  8. 【洛谷P1966】火柴排队

    火柴排队 题目链接 ∑(ai​−bi​)^2=∑ai^2-2*∑ai*bi+∑bi^2 显然∑ai^2+∑bi^2是不变的,我们要让 2*∑ai*bi最大,才能使原式最小 然后我们一眼就可以看出来, ...

  9. luogu P1966 火柴排队 (逆序对)

    luogu P1966 火柴排队 题目链接:https://www.luogu.org/problemnew/show/P1966 显然贪心的想,排名一样的数相减是最优的. 证明也很简单. 此处就不证 ...

随机推荐

  1. Go-简介-发展

    01-Go语言介绍 目录 Go语言介绍 Go语言特性 Go语言发展(版本/特性) Go语言应用 谁在用 应用领域 Go语言项目 Go语架构 Go语言发展前景 Go语言介绍 Go 即Golang,是Go ...

  2. linux上一些常用的命令

    1.时时查看tomcat启动信息,首先切换到tomcat的logs目录下 tail -f catalina.out 2.在tomcat的bin目录下启动无权限,需要赋权 chmod 777 *.sh ...

  3. c语言中fflush的运用为什么没有效果呢,测试平台linux

    /************************************************************************* > File Name: clearing. ...

  4. centos 7 安装及配置zabbix agent

    一.在被监控主机上设置防火墙,允许zabbix-agent的10050端口通过 二.执行yum list |grep zabbix,找到zabbix的agent安装包并安装 三.在 /etc/zabb ...

  5. Java复习(五)接口与多态

    5.1接口 允许创建者规定方法的基本形式:方法名.参数列表以及返回类型,但不规定方法主体. 也可以包含基本数据类型的数据成员,但他们都默认为static和final 声明格式为 [接口修饰符]inte ...

  6. 25)PHP,数据库定义

    (1)数据库定义语句: create database [if not exists ] 数据库名 [charset 字符集] [collate 字符排序规则]: 说明: ,if not exists ...

  7. 算法笔记4.3递归 问题 B: 数列

    题目描述 编写一个求斐波那契数列的递归函数,输入n 值,使用该递归函数,输出如下图形(参见样例). 输入 输入第一行为样例数m,接下来有m行每行一个整数n,n不超过10. 输出 对应每个样例输出要求的 ...

  8. .net core ioc

    -------------------------------------- 2. ---------------------------- -----------aop

  9. slqmap简单使用

    网址:-u 指定哪个参数:-p 需要登录用--cookie 获得所有数据库:--dbs 获得所有用户:--users 指定某个数据库:-D 显示所有表--tables 指定某个数据表:-T 显示列:- ...

  10. Java接口和抽象类区别

    1.抽象类 [public] abstract class ClassName { abstract void fun(); } extends 包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有 ...