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 显然贪心的想,排名一样的数相减是最优的. 证明也很简单. 此处就不证 ...
随机推荐
- MySQL和Java数据类型对照表
Java MySQL数据类型对照 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述 VARCHAR L+N VARCHAR java.lang.S ...
- python使用rsa非对称加密
1.安装rsa 支持python 2.7 或者 python 3.5 以上版本 使用豆瓣pypi源来安装rsa pip install -i https://pypi.douban.com/simpl ...
- 一个简单WebApp的全程
开始前,我先给出上一篇选项卡的demo链接http://xqhuadou.com/demo1/index.html.相信看着应该很带感,不过这个是之前经过修改的. 制作过程我就不多说了,可以直接看源码 ...
- Dinic学习笔记
网络流是啥不用我说了吧 增广路定理不用我说了吧 Dinic就是分层然后只在层间转移,然后就特别快,\[O(N^2M)\] 伪代码: function dinic int flow = 0 ; whil ...
- codeforce 1189C Candies! ----前缀和
题目大意:给你一个数组每个数不大于9,然后给你m个区间,每个区间的长度都是2的k次方(k=0 1 2.....) 有一种操作是把奇数位和偶数位相加 用和来代替之前的两个数,如果和大于等于10就要膜 ...
- Python语言学习:pyc是什么
一.pyc 1.PyCodeObject:是python编译器真正编译成的结果 当python程序运行时,编译的结果是保存在位于内存中的PyCodeObject中.当python程序运行结束时,pyt ...
- mysql统计指定数据库的各表的条数
mysql统计指定数据库的各表的条数 SELECT table_schema,table_name,table_rows,CREATE_TIME FROM TABLES WHERE TABLE_SCH ...
- js获取当前页面名称
// 取当前页面名称(不带后缀名) function pageName() { var a = location.href; var b = a.split("/"); var c ...
- 存储过程获取QLIKVIEW关键数据
declare @table table(DDID INT,FHDID INT ,CKDID INT,ZGYSDID INT,CWYSDID INT)--定义表变量来存放存储过程返回的内容insert ...
- RAM-Based Shift Register (ALTSHIFT_TAPS) IP Core-实现3X3像素阵列存储
最近想要实现CNN的FPGA加速处理,首先明确在CNN计算的过程中,因为卷积运算是最耗时间的,因此只要将卷积运算在FPGA上并行实现,即可完成部分运算的加速 那么对于卷积的FPGA实现首先要考虑的是卷 ...