题目描述

涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:∑(ai​−bi​)2

其中ai​ 表示第一列火柴中第ii个火柴的高度,bi​表示第二列火柴中第 ii 个火柴的高度。

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

输入输出格式

输入格式:

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

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

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

输出格式:

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

输入输出样例

输入样例#1:

4
2 3 1 4
3 2 1 4
输出样例#1:

1
输入样例#2:

4
1 3 4 2
1 7 2 4
输出样例#2:

2

说明

【输入输出样例说明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≤火柴高度≤ maxlongint

解题思路:

看样例和题目,我们会发现这道题从人类的思维考虑并不难,只需将大的靠大的,小的靠小的即可.

但我们需要将其转化为机器可以理解的思维:我们将第一个序列离散化后按照输入顺序定义为1~n(也就是说原来序列的数字已经不是我们日常认知里的数字了,而是我们新定义的数字),将第二个序列离散化,将离散化后的序列按照第一个序列的对应关系转化为我们新定义的数字,求逆序对个数,即为答案.

AC代码:

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
#define lowbit(k) k & -k using namespace std; long long n,a[],b[],c[],d[],e[];
map<int,int > l; inline void Discretization2() {
sort(d+,d+n+);
unique(d+,d++n) - (d + );
for(int i = ;i <= n; i++) c[i] = lower_bound(d+,d++n,c[i]) - d;
} void Discretization() {//离散化
sort(b+,b+n+);
unique(b+,b++n) - (b + );
for(int i = ;i <= n; i++) a[i] = lower_bound(b+,b++n,a[i]) - b;
} inline void jia(int x,int y) {
while(x <= n) {
e[x] += y;
x += lowbit(x);
}
} int sum(int x) {
long long p = ;
for(int i = x;i > ; i -= lowbit(i)) p += e[i];
return p;
} int main()
{
scanf("%lld",&n);
for(int i = ;i <= n; i++) {
scanf("%lld",&a[i]);
b[i] = a[i];
}
Discretization();
for(int i = ;i <= n; i++) {
scanf("%lld",&c[i]);
d[i] = c[i];
l[a[i]] = i;
}
Discretization2();
for(int i = ;i <= n; i++)
c[i] = l[c[i]];
long long ans = ;
for(int i = n;i > ; i--) {//树状数组求逆序对个数
jia(c[i],);
ans += sum(c[i]-);
}
printf("%lld",ans%);//千万要%99999997,不然只能得80分
return ;
}

//NOIP2013提高 day1 t2

洛谷 P1966 火柴排队的更多相关文章

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

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

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

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

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

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

  4. 洛谷——P1966 火柴排队&&P1774 最接近神的人_NOI导刊2010提高(02)

    P1966 火柴排队 这题贪心显然,即将两序列中第k大的数的位置保持一致,证明略: 树状数组求逆序对啦 浅谈树状数组求逆序对及离散化的几种方式及应用 方法:从前向后每次将数插入到bit(树状数组)中, ...

  5. [洛谷P1966] 火柴排队

    题目链接: 火柴排队 题目分析: 感觉比较顺理成章地就能推出来?似乎是个一眼题 交换的话多半会往逆序对上面想,然后题目给那个式子就是拿来吓人的根本没有卵用 唯一的用处大概是告诉你考虑贪心一波,很显然有 ...

  6. 洛谷 P1966 火柴排队 —— 思路

    题目:https://www.luogu.org/problemnew/show/P1966 首先,一个排列相邻交换变成另一个排列的交换次数就是逆序对数: 随便画一画,感觉应该是排个序,大的对应大的, ...

  7. 洛谷——P1966 火柴排队

    https://www.luogu.org/problem/show?pid=1966 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列 ...

  8. 洛谷p1966 火柴排队 (逆序对变形,目标排序

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

  9. 洛谷P1966 火柴排队 贪心+离散化+逆序对(待补充QAQ

    正解: 贪心+离散化+逆序对 解题报告: 链接在这儿呢quq 这题其实主要难在想方法吧我觉得?学长提点了下说用贪心之后就大概明白了,感觉没有很难 但是离散化这里还是挺有趣的,因为并不是能很熟练地掌握离 ...

随机推荐

  1. linux C 中的volatile使用

    一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存 ...

  2. jenkins的代理设置,方便下载插件

    jenkins在下载插件的时候,总是网络不通,需要设置代理跨越长城 java.net.SocketTimeoutException: connect timed out Caused: java.ne ...

  3. paramiko连接sshd使用的hostkey

    1.sshd的hostkey设置: cat /etc/ssh/sshd_config 里面有rsa/dsa/ecdsa/ed25519 2.查看paramiko的keys选择顺序,如图所示 3.由以上 ...

  4. HTML5 <template>标签元素简介

    一.HTML5 template元素初面 <template>元素,基本上可以确定是2013年才出现的.干嘛用的呢,顾名思意,就是用来声明是“模板元素”. 目前,我们在HTML中嵌入模板H ...

  5. vi和vim上查找字符串

    方法/步骤 1 我们以samba的配置文件为例,搜索一个user的字符串. vim /etc/samba/smb.conf 打开smb.conf 2 命令模式下,输入/user "/&quo ...

  6. libpython2.7.so.1.0: cannot open shared object file: No such file or directory

    解决方法如下: 1.编辑      vi /etc/ld.so.conf  如果是非root权限帐号登录,使用 sudo vi /etc/ld.so.conf  添加上python2.7的lib库地址 ...

  7. 使用MySQL Workbench进行数据库设计——MySQL Workbench用法总结

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/48318877 本文出自[我是干勾鱼的博客] 1 简单介绍 MySQL Workb ...

  8. Office EXCEL 中单元格怎么打斜线

    右击单元格,然后设置单元格格式,然后添加需要的边框     注意里面的文字有讲究,比如我要右上角显示Value,左下角显示Payload,则需要先输一堆空格,然后输入Value,把Value挤到右边去 ...

  9. 系统重装 Ghost系统的disk to image等等是什么意思

    localdiskto disk to imade from imagepartitionto partition to image from imagecheckimage file disk这些是 ...

  10. export setenv

    bash export LD_LIBRARY_PATH="../third_party/lib:$LD_LIBRARY_PATH" csh setenv LD_LIBRARY_PA ...