洛谷 P1966 火柴排队
题意
给定2个等长序列a、b,要求通过交换使
\[\sum_{i=1}^{n}(a_i-b_i)^2\]
最小。
分析
看着这个式子,我突然想到了方差。很明显,方差反应数据的波动程度,所以让数据集中就可以使方差变小了。而对应到这个公式,大方向就是让这两个数据尽可能接近。很容易想到分别排序,\(a_i,b_i\)就是对应数了(自己取的名字)。
这怎么证明呢?因为这个公式中带有平方,这会增加极限值对结果的贡献,所以要尽可能缩小最大差值(这也是方差教给我们的w)
那么要让a、b两个序列中的数对应,就要将a与b中的数建立一一对应的映射关系。这样,其中一个序列会作为排序的判定条件(也可以理解为判定大小的标准),而另一个序列就是要交换的序列了。这一过程其实就是离散化。
排序与求逆序对复杂度都是\(O(nlog_2n)\),10w可过。
代码
#include<iostream>
#include<algorithm>
using namespace std;const int MAXN=100005,mod=99999997;
int n,m;
int p[MAXN],arr[MAXN],ans;
struct match{int value,order;
}a[MAXN],b[MAXN];bool comp(match m1,match m2)
{return m1.value<m2.value;
}int lowbit(int x)
{return x&(-x);
}void add(int x,int num)
{for(int i=x;i<=n;i+=lowbit(i))arr[i]+=num;return;
}int sum(int x)
{int temp=0;for(int i=x;i;i-=lowbit(i))temp+=arr[i];return temp;
}int main()
{cin>>n;for(int i=1;i<=n;i++)cin>>a[i].value,a[i].order=i;for(int i=1;i<=n;i++)cin>>b[i].value,b[i].order=i;//order记录顺序 sort(a+1,a+1+n,comp);sort(b+1,b+1+n,comp);//排序后就将两个序列建立对应关系了 for(int i=1;i<=n;i++)p[b[i].order]=a[i].order;for(int i=1;i<=n;i++)add(p[i],1),ans=(ans+i-sum(p[i]))%mod;//树状数组求逆序对 cout<<ans;return 0;
}
转载于:https://www.cnblogs.com/ehznehc/p/11335008.html
洛谷 P1966 火柴排队相关推荐
- 洛谷 P1966 火柴排队 —— 思路
题目:https://www.luogu.org/problemnew/show/P1966 首先,一个排列相邻交换变成另一个排列的交换次数就是逆序对数: 随便画一画,感觉应该是排个序,大的对应大的, ...
- 洛谷P1966 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 nn 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:\sum (a_i-b_i)^2∑(a ...
- 洛谷 P1966 火柴排队【树状数组】
题目描述 涵涵有两盒火柴,每盒装有n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为 ∑ni=1(ai−bi)2 ∑ i = 1 ...
- 洛谷P1966 火柴排队(逆序对)
题意 题目链接 Sol 不算很难的一道题 首先要保证权值最小,不难想到一种贪心策略,即把两个序列中rank相同的数放到同一个位置 证明也比较trivial.假设\(A\)中有两个元素\(a, b\), ...
- 洛谷P1966 火柴排队(cdq分治 + 逆序对)
2020.6.8 练二分了当然要练练分治,这些基础的处理手段真的还是蛮好用的. 这道题是问ai 和bi的平方和最小,最少需要的相邻的交换次数.手动模拟了一下感觉没什么思路.但是后来注意到每次只能移动相 ...
- NOIP2013 火柴排队 [洛谷P1966]
NOIP2013 火柴排队 [洛谷P1966] 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之 ...
- P1966 火柴排队题解
P1966 火柴排队 题意:有两列火柴,各有各的高度,两两高度不同,每次只能交换相邻的数,问最少交换多少次,使得 ∑ ( a i − b i ) 2 \sum (a_i-b_i)^2 ∑(ai−bi ...
- 洛谷 P1149 火柴棒等式(太suang络吧)
题目描述 给你n根火柴棍,你可以拼出多少个形如"A+B=CA+B=C"的等式?等式中的AA.BB.CC是用火柴棍拼出的整数(若该数非零,则最高位不能是00).用火柴棍拼数字0-90 ...
- 【洛谷P1966】火柴排队
两列排序后将编号一一对应 归并排序求逆序对 (每一次交换就去掉一个逆序对) 1 #include<cstdio> 2 #include<cstring> 3 #include& ...
最新文章
- 如何成为一名无人驾驶工程师
- 机器学习最有价值的6个经验教训
- qt build错误
- 转载:k2pdfopt详细教程-让kindle看遍所有pdf
- 工作问题之:redis 保存快照问题
- 【CodeForces - 361D】Levko and Array (二分,dp)
- 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
- 四、瞰景Smart3D创建工程
- activex控件 java开发_ActiveX控件开发总结
- UTM坐标转GPS方法分享
- Sublime中使用livereload插件实时预览html文件
- 凡刻(Fenke)FK169机械手表测评
- 华硕主板装系统蓝屏_华硕主板装系统蓝屏怎样设置bios?
- 基于python的第三方库Pyautogui实现程序自动控制鼠标与键盘
- mysql数据库教程外联_活字格外联数据库SQLServer和Mysql的经验(大多数经验也适合其它使用外联数据库的平台)...
- Navicat 压缩包免费下载
- 苹果开发者账号的那些坑
- python实现简单的图片文字识别脚本
- CSS - 制作网页技巧
- gulp 雪碧图制作