洛谷 P1966 火柴排队 解题报告
P1966 火柴排队
题目描述
涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: \(\sum (a_i-b_i)^2\)其中 \(a_i\) 表示第一列火柴中第 \(i\) 个火柴的高度, \(b_i\) 表示第二列火柴中第 \(i\) 个火柴的高度。
每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 \(99,999,997\) 取模的结果。
输入输出格式
输入格式:
共三行,第一行包含一个整数 \(n\) ,表示每盒中火柴的数目。
第二行有 \(n\) 个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。
第三行有 \(n\) 个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。
输出格式:
一个整数,表示最少交换次数对 \(99,999,997\) 取模的结果。
数据范围
对于 \(10\%\) 的数据, \(1 ≤ n ≤ 10\);
对于 \(30\%\) 的数据, \(1 ≤ n ≤ 100\) ;
对于 \(60\%\) 的数据, \(1 ≤ n ≤ 1,000\) ;
对于 \(100\%\) 的数据, \(1 ≤ n ≤ 100,000\),\(0≤\) 火柴高度 \(≤\) \(maxlongint\)
感觉蛮神奇的一道题目。
玩一下我们感觉,两边第\(i\)大的相互对着是最优的。
证明可以先拆平方,然后利用邻项交换证明最优性。
离散一下,我们发现其实就是求逆序对。
处理起来可能比较麻烦,但把所有数组都搞出来反而不容易错。
Code:
#include <cstdio>
#include <algorithm>
#define ll long long
const int N=100010;
struct node
{
int pos;ll h;
bool friend operator <(node n1,node n2)
{
return n1.h<n2.h;
}
}a[N],b[N];
ll s[N],c[N],d[N],e[N],f[N],ans;
int n;
ll query(int x)
{
ll sum=0;
while(x)
{
sum+=s[x];
x-=x&-x;
}
return sum;
}
void add(int x)
{
while(x<=n)
{
s[x]++;
x+=x&-x;
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i].h);
a[i].pos=i;
}
for(int i=1;i<=n;i++)
{
scanf("%lld",&b[i].h);
b[i].pos=i;
}
std::sort(a+1,a+1+n);
std::sort(b+1,b+1+n);
for(int i=1;i<=n;i++)
{
c[a[i].pos]=i;
d[b[i].pos]=i;
}
for(int i=1;i<=n;i++)
e[d[i]]=i;
for(int i=1;i<=n;i++)
f[i]=e[c[i]];
for(int i=1;i<=n;i++)
{
(ans+=query(n)-query(f[i]))%=99999997;
add(f[i]);
}
printf("%lld\n",ans);
return 0;
}
2018.8.5
洛谷 P1966 火柴排队 解题报告的更多相关文章
- [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)
[NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...
- 【刷题】洛谷 P1966 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- 洛谷——P1966 火柴排队&&P1774 最接近神的人_NOI导刊2010提高(02)
P1966 火柴排队 这题贪心显然,即将两序列中第k大的数的位置保持一致,证明略: 树状数组求逆序对啦 浅谈树状数组求逆序对及离散化的几种方式及应用 方法:从前向后每次将数插入到bit(树状数组)中, ...
- 洛谷P1966 火柴排队 贪心+离散化+逆序对(待补充QAQ
正解: 贪心+离散化+逆序对 解题报告: 链接在这儿呢quq 这题其实主要难在想方法吧我觉得?学长提点了下说用贪心之后就大概明白了,感觉没有很难 但是离散化这里还是挺有趣的,因为并不是能很熟练地掌握离 ...
- [洛谷P1966] 火柴排队
题目链接: 火柴排队 题目分析: 感觉比较顺理成章地就能推出来?似乎是个一眼题 交换的话多半会往逆序对上面想,然后题目给那个式子就是拿来吓人的根本没有卵用 唯一的用处大概是告诉你考虑贪心一波,很显然有 ...
- 洛谷 P1966 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:∑(ai−bi)2 其中ai 表示 ...
- 洛谷 P1966 火柴排队 —— 思路
题目:https://www.luogu.org/problemnew/show/P1966 首先,一个排列相邻交换变成另一个排列的交换次数就是逆序对数: 随便画一画,感觉应该是排个序,大的对应大的, ...
- 洛谷——P1966 火柴排队
https://www.luogu.org/problem/show?pid=1966 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列 ...
- 洛谷p1966 火柴排队 (逆序对变形,目标排序
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
随机推荐
- javascript常用对象方法
concat:连接产生一个新数组 [1,2].concat([3,4]) >> [1, 2, 3, 4] filter:返回符合条件的一个新数组 [1,2,3,4,5].filte ...
- 【转】Buff机制及其实际运用
转自 http://bbs.gameres.com/forum.php?mod=viewthread&tid=215027 首先我想说的是,这是一套机制,并不是单独的一个系统,所谓机制就是一种 ...
- adb 常用命令及操作
获取序列号: adb get-serialno 查看连接计算机的设备: adb devices 重启机器: adb reboot 重启到bootloader,即刷机模式: adb reboot boo ...
- 【shell 练习5】编写简单的多级菜单
一.简单的多级菜单 [root@web129 ~]# cat menu.sh #!/bin/bash #shell菜单演示 function menu() { echo -e `date` cat & ...
- Simple Pipelined Function
SELECT * FROM TABLE(PKG_TEST.FN_DIC_DB_TAB) CREATE OR REPLACE PACKAGE PKG_TEST IS TYPE OBJ_DICDB_R ...
- POJ 1228 Grandpa's Estate(凸包唯一性判断)
Description Being the only living descendant of his grandfather, Kamran the Believer inherited all o ...
- codeforces 269C Flawed Flow(网络流)
Emuskald considers himself a master of flow algorithms. Now he has completed his most ingenious prog ...
- 针对“来用”团队项目之NABC分析
本项目特点之一:扩展性强 NABC分析: N(need):我们这个开发的这个软件主要是集娱乐软件和实用工具于一身的大容器,这里面有很多应用程序,针对不同用户需要,至少有一款应用程序能够满足用户的需要, ...
- WIN8/8.1/10进入BIOS方法图解
1.首先点击桌面左下角的"开始". 2.然后点击电源. 3.然后按住shift,同时点击"重启".于是进入这个画面: 4.然后点击"疑难解答" ...
- 原生js移动端可拖动进度条插件
该插件最初的想法来自网上的一篇文章,直达链接:https://www.cnblogs.com/libin-1/p/6220056.html 笔者因为业务需要寻找到这个插件,然后拿来用之,发现各种不方便 ...