Luogu_1966_火柴排队
题目描述
涵涵有两盒火柴,每盒装有\(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_火柴排队的更多相关文章
- Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对
题目:http://codevs.cn/problem/3286/ 3286 火柴排队 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : ...
- 洛谷P1966 【火柴排队】
题解 P1966 [火柴排队] 说明: 在数学中有个公式: (a1-b1)^2+(a2-b2)^2<(a2-b1)^2+(a1-b2)^2 (你可以自己试着证一下) 两列火柴对应的两根火柴在各列 ...
- [树状数组+逆序对][NOIP2013]火柴排队
火柴排队 题目描述 涵涵有两盒火柴,每盒装有n根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑ (ai-bi)2,i=1,2,3,. ...
- 【刷题】洛谷 P1966 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)
[NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...
- LOJ2609. NOIP2013 火柴排队 【树状数组】
LOJ2609. NOIP2013 火柴排队 LINK 题目大意: 给你两个数列,定义权值∑i=1(ai−bi)^2 问最少的操作次数,最小化权值 首先需要发现几个性质 最小权值满足任意i,j不存在a ...
- 洛谷 P1966 火柴排队 解题报告
P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: \(\s ...
- 【洛谷P1966】火柴排队
火柴排队 题目链接 ∑(ai−bi)^2=∑ai^2-2*∑ai*bi+∑bi^2 显然∑ai^2+∑bi^2是不变的,我们要让 2*∑ai*bi最大,才能使原式最小 然后我们一眼就可以看出来, ...
- luogu P1966 火柴排队 (逆序对)
luogu P1966 火柴排队 题目链接:https://www.luogu.org/problemnew/show/P1966 显然贪心的想,排名一样的数相减是最优的. 证明也很简单. 此处就不证 ...
随机推荐
- 吴裕雄--天生自然 PYTHON3开发学习:基本数据类型
#!/usr/bin/python3 counter = 100 # 整型变量 miles = 1000.0 # 浮点型变量 name = "runoob" # 字符串 print ...
- redis的过期策略
1.了解redis 什么是Redis,为啥用缓存? Redis是用内存当缓存的.Redis主要是基于内存来进行高性能.高并发的读写操作的. 内存是有限的,比如Redis就只能用10个G,你一直往里面写 ...
- UML-类图-箭头
概览 1.泛化 一般理解为 继承.实线+空心箭头 2.依赖 成员变量.局部变量.参数.虚线+箭头 public class Sale { public void updatePriceFor(Prod ...
- Half of UK 10-year-olds own a smartphone
1. preposition n. 介词 pronoun n. 代词 2. despite /preposition. (1) used to say that something happens ...
- OracleXE 11g user莫名过期
参考大大的 环境sqlplus 1.sysdba登陆 SQL>conn sys as sysdba password 2.查看用户状态 SQL>select username,accoun ...
- 估计量|估计值|矩估计|最大似然估计|无偏性|无偏化|有效性|置信区间|枢轴量|似然函数|伯努利大数定理|t分布|单侧置信区间|抽样函数|
第二章 置信区间估计 估计量和估计值的写法? 估计值希腊字母上边有一个hat 点估计中矩估计的原理? 用样本矩来估计总体矩,用样本矩的连续函数来估计总体矩的连续函数,这种估计法称为矩估计法.Eg:如果 ...
- liunx常用命令笔记
安装软件教程 linux安装java:https://www.cnblogs.com/lamp01/p/8932740.html linux安装mysql:https://www.cnblogs.co ...
- LeetCode——1305. 两棵二叉搜索树中的所有元素
给你 root1 和 root2 这两棵二叉搜索树. 请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序.. 示例 1: 输入:root1 = [2,1,4], root2 = [1,0 ...
- virtualbox Ubuntu拒绝root用户ssh远程登录
http://www.bcty365.com/content-122-6241-1.html
- Ansible部署rsync、nfs及sersync
rsync nfs sersync httpd环境: 角色 外网IP(NAT) 内网IP(LAN) 主机名 Rsync服务端 eth0:10.0.1.51 eth1:172.16.1.51 backu ...