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 显然贪心的想,排名一样的数相减是最优的. 证明也很简单. 此处就不证 ...
随机推荐
- UML-类图-如何画引用类和集合?
1.画引用类 引用到了类时,需要画关联线,否则其他基本类型(int.string.date等)不画. 2.画集合 当然,方法1中可加入箭头.对应java代码: public class Sale { ...
- 深入理解spring中的AOP原理 —— 实现MethodInterceptor接口,自已动手写一个AOP
1.前言 AOP是面向切面编程,即“Aspect Oriented Programming”的缩写.面对切面,就是面向我们的关注面,不能让非关注面影响到我们的关注面.而现实中非关切面又必不可少,例 ...
- sql字符串常用函数
1.replace REPLACE(String,from_str,to_str) 即:将String中所有出现的from_str替换为to_str 2.left left(String,2) 从 ...
- SLAM领域资源链接
半闲居士高翔博客: https://www.cnblogs.com/gaoxiang12/ 视觉大佬冯兵博客: http://www.fengbing.net/ SLAMCN http://www.s ...
- 脚本kafka-configs.sh用法解析
引用博客来自李志涛:https://www.cnblogs.com/lizherui/p/12275193.html 前言介绍 网络上针对脚本kafka-configs.sh用法,也有一些各种文章,但 ...
- Arcengine对Com组件调用返回错误
将AE对象序列化如果路径不对或者没权限就会出现: 将xml反序列化为AE对象某些电脑上会出现,但是加上trycatch,不理会这个错误,也能反序列化成功:
- 吴裕雄--天生自然 PYTHON3开发学习:函数
def 函数名(参数列表): 函数体 # 计算面积函数 def area(width, height): return width * height def print_welcome(name): ...
- Android开发学习3
学习内容: 1.复选框CheckBox 2.ImageView & 使用第三方库加载网络图片 3.列表视图ListView 4.网格视图GridView 5.ScrollView & ...
- 基础服务系列-Jupyter Install TensorFlow
TensorFlow is a deep learning framework that provides an easy interface to a variety of functionalit ...
- python学习——list
list 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推.Python有6个序列的内置类型,但最常见的是列表和元组 ...