题意

给定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 火柴排队相关推荐

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

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

  2. 洛谷P1966 火柴排队

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

  3. 洛谷 P1966 火柴排队【树状数组】

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

  4. 洛谷P1966 火柴排队(逆序对)

    题意 题目链接 Sol 不算很难的一道题 首先要保证权值最小,不难想到一种贪心策略,即把两个序列中rank相同的数放到同一个位置 证明也比较trivial.假设\(A\)中有两个元素\(a, b\), ...

  5. 洛谷P1966 火柴排队(cdq分治 + 逆序对)

    2020.6.8 练二分了当然要练练分治,这些基础的处理手段真的还是蛮好用的. 这道题是问ai 和bi的平方和最小,最少需要的相邻的交换次数.手动模拟了一下感觉没什么思路.但是后来注意到每次只能移动相 ...

  6. NOIP2013 火柴排队 [洛谷P1966]

    NOIP2013 火柴排队 [洛谷P1966] 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之 ...

  7. P1966 火柴排队题解

    P1966 火柴排队 题意:有两列火柴,各有各的高度,两两高度不同,每次只能交换相邻的数,问最少交换多少次,使得 ∑ ( a i − b i ) 2 \sum (a_i-b_i)^2 ∑(ai​−bi ...

  8. 洛谷 P1149 火柴棒等式(太suang络吧)

    题目描述 给你n根火柴棍,你可以拼出多少个形如"A+B=CA+B=C"的等式?等式中的AA.BB.CC是用火柴棍拼出的整数(若该数非零,则最高位不能是00).用火柴棍拼数字0-90 ...

  9. 【洛谷P1966】火柴排队

    两列排序后将编号一一对应 归并排序求逆序对 (每一次交换就去掉一个逆序对) 1 #include<cstdio> 2 #include<cstring> 3 #include& ...

最新文章

  1. 如何成为一名无人驾驶工程师
  2. 机器学习最有价值的6个经验教训
  3. qt build错误
  4. 转载:k2pdfopt详细教程-让kindle看遍所有pdf
  5. 工作问题之:redis 保存快照问题
  6. 【CodeForces - 361D】Levko and Array (二分,dp)
  7. 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
  8. 四、瞰景Smart3D创建工程
  9. activex控件 java开发_ActiveX控件开发总结
  10. UTM坐标转GPS方法分享
  11. Sublime中使用livereload插件实时预览html文件
  12. 凡刻(Fenke)FK169机械手表测评
  13. 华硕主板装系统蓝屏_华硕主板装系统蓝屏怎样设置bios?
  14. 基于python的第三方库Pyautogui实现程序自动控制鼠标与键盘
  15. mysql数据库教程外联_活字格外联数据库SQLServer和Mysql的经验(大多数经验也适合其它使用外联数据库的平台)...
  16. Navicat 压缩包免费下载
  17. 苹果开发者账号的那些坑
  18. python实现简单的图片文字识别脚本
  19. CSS - 制作网页技巧
  20. gulp 雪碧图制作

热门文章

  1. 阿里云centos配置nginx和nodejs
  2. spark-scheduled调度算法
  3. mybatis源码分析之事务管理器
  4. 深入理解PHP内核(五)函数的内部结构
  5. 常用memcached命令详解
  6. jQuery EasyUI API 中文文档 - DataGrid 数据表格
  7. php file函数在内容与底层逻辑分离的应用
  8. 用Python从零开始创建区块链
  9. 区块链学习之-发布合约
  10. 同步等待 异步等待_异步/等待和承诺的解释