【题目描述 Description】
涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:

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

输入描述 Input Description

共三行,第一行包含一个整数 n,表示每盒中火柴的数目。
第二行有 n 个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。
第三行有 n 个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。

输出描述 Output Description

输出共一行,包含一个整数,表示最少交换次数对 99,999,997 取模的结果。

样例输入 Sample Input

[Sample 1]

2 3 1 4 
3 2 1 4
[Sample 2]

1 3 4 2 
1 7 2 4

样例输出 Sample Output

[Sample 1]
1
[Sample 2]
2

数据范围及提示 Data Size & Hint

【样例1说明】
最小距离是 0,最少需要交换 1 次,比如:交换第 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 ≤火柴高度≤ 2^31 - 1。

【解题思路】

很明显可以看出,排序之后一一对应的值就是最小值

这个题刚开始我是把A排序,然后按照A的变化去变换B然后求逆序对,这个做法并不是正确的因为B刚开始也是无序的,如果将B按照A的方式求逆序对并不能得出正确的解。

应该把A,B都排一下序,然后按照B的标号处理A,就是另开一个C数组,数组变量是A的序号,组内储存对应位置B的标号,表示需要把在A[I]元素移动到j位置上,再将A重标号后的数据求逆序对。

 program huochai;
type aa=record
no,sum:Longint;
end;
zz=array[..] of aa;
const mo=;
var n,i,ans:longint;
a,f:array[..] of aa;
b,c,d,e:array[..] of longint;
procedure sort(l,r: longint; var c:zz);
var
i,j,x,y: longint;
begin
i:=l;
j:=r;
x:=c[(l+r) div ].sum; repeat
while c[i].sum<x do
inc(i);
while x<c[j].sum do
dec(j);
if not(i>j) then
begin
c[]:=c[i];
c[i]:=c[j];
c[j]:=c[];
inc(i);
j:=j-; end; until i>j;
if l<j then
sort(l,j,c);
if i<r then
sort(i,r,c);
end; procedure guibing(l,r:longint);
var mid,i,q1,q2,q3:longint;
begin
mid:=(l+r) div ;
if l+<r then
begin
guibing(l,mid);
guibing(mid+,r);
end;
for i:=l to mid do
c[i]:=b[i];
for i:=mid+ to r do
d[i]:=b[i];
q1:=l;
q2:=mid+;
q3:=l;
while (q1<mid+) and (q2<r+) do
begin
if c[q1]<d[q2] then
begin
e[q3]:=c[q1];
inc(q1);
inc(q3);
end
else
begin
e[q3]:=d[q2];
ans:=((mid-q1+) mod mo+ans) mod mo;
inc(q3);
inc(q2);
end;
end;
if q2=r+ then
for i:=q1 to mid do
begin
e[q3]:=c[i];
inc(q3);
end
else
for i:=q2 to r do
begin
e[q3]:=d[i];
inc(q3);
end;
for i:=l to r do b[i]:=e[i]; end; begin
read(n);
for i:= to n do read(a[i].sum);
for i:= to n do
begin
a[i].no:=i;
f[i].no:=i;
end;
for i:= to n do read(f[i].sum);
sort(,n,a);
sort(,n,f);
for i:= to n do b[a[i].no]:=f[i].no;//重点在这里!!! guibing(,n);
writeln(ans);
end.

CODEVS 3286 火柴排队的更多相关文章

  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. 0x80029C4A

    法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Exc ...

  2. Android之HTTP网络通信--GET传递(二)

    根据上一篇写的是实现了通过url接口将接口中的数据显示出来,这次根据上一篇的基础,进一步说明一下AsynTask的使用. AsynTask类有几个函数是大家必须知道的. doInBackGround( ...

  3. multi-threads synchronization use conditional mutex

    #include <pthread.h> int thread_flag; pthread_cond_t thread_flag_cv; pthread_mutex_t thread_fl ...

  4. JavaScript高级程序设计(第三版)学习,第一次总结

    Array类型 var arr = []; arr.length; //返回数组元素个数 改变length可以动态改变数组大小 检测数组 instanceof可以检测某个对象是否是数组,限制:只能是一 ...

  5. sparkSQL1.1入门

    http://blog.csdn.net/book_mmicky/article/details/39288715 2014年9月11日,Spark1.1.0忽然之间发布.笔者立即下载.编译.部署了S ...

  6. vim自动补全:go

    1 环境配置 export GOPATH=/home/go 2 在新建GOPATH下新建三个目录 mkdir src pkg bin src 存放源码pkg 存放编译生成的文件bin 存放生成的可执行 ...

  7. [04] SQL语句优化之索引

    1.索引的概念 根据书的目录可以知道内容所在的页码,不用一页一页翻书,可直接通过页码找到内容.数据库的索引类似于书本的目录,索引指向内容存储位置,可直接定位到内容而不必扫描整张表,减少了磁盘的I/O次 ...

  8. 禁用浏览器缓存Ajax请求

    $.ajax({ url: 'url.php', cache: false, success: function(data){ //..... } }); 仅Get有缓存, Post不会缓存

  9. JavaScript学习笔记(2)——JavaScript和DOM的关系

    文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.DOM实际上是以面向对象方式描述的文档模型.DOM定义了表示和修改文档所需的 ...

  10. KMP入门(周期)

    Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...