【NOIP2013】火柴排队 题解(贪心+归并排序)
前言:一道水题。
-----------------------
题目大意:给出数列$a_i$和$b_i$,问使$\sum_{i=1}^n (a_i-b_i)^2$最小的最少操作次数。
首先,如果两个数列相同位置的数排名相同,那么符合题意。现在我们证明一下:
证明:$a_i<a_j,b_i<b_j,(a_i-b_i)^2+(a_j-b_j)^2<(a_i-b_j)^2+(b_i-a_j)^2$
$(a_i-b_j)^2+(b_i-a_j)^2=a_i^2+b_i^2+a_j^2+b_j^2-2a_ib_j-2b_ia_j$
$(a_i-b_i)^2+(a_j-b_j)^2=a_i^2+b_i^2+a_j^2+b_j^2-2a_ib_i-2a_jb_j$
上式减下式得:$2a_i(b_i-b_j)+2a_j(b_j-b_i)$
$=2a_i(b_i-b_j)-2a_j(b_i-b_j)$
$=2(a_i-a_j)(b_i-b_j)>0$
所以$(a_i-b_i)^2+(a_j-b_j)^2<(a_i-b_j)^2+(b_i-a_j)^2$。
证毕。
计算次数的话就是比较新的位置和之前的位置,归并排序解决。其实就是归并排序求逆序对的变形。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=;
int n,c[],r[],ans;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){
if (ch=='-') f=-;
ch=getchar();
}while(isdigit(ch)){
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
struct node
{
int x,l;
}a[],b[];
bool cmp(node s,node y)
{
return s.x<y.x;
}
void msort(int l,int ri)
{
if (l>=ri) return;
int mid=(l+ri)>>;
msort(l,mid);
msort(mid+,ri);
int i,j,k;
for (i=l,j=mid+,k=l;i<=mid&&j<=ri;)
if (c[i]>c[j])
{
ans=(ans+ri-j+)%mod;
r[k]=c[i];i++;k++;
}
else
{
r[k]=c[j];k++;j++;
}
for (;i<=mid;i++,k++) r[k]=c[i];
for (;j<=ri;j++,k++) r[k]=c[j];
for (int s=l;s<=ri;s++) c[s]=r[s];
}
signed main()
{
n=read();
for (int i=;i<=n;i++) a[i].x=read(),a[i].l=i;
for (int i=;i<=n;i++) b[i].x=read(),b[i].l=i;
sort(a+,a+n+,cmp);
sort(b+,b+n+,cmp);
for (int i=;i<=n;i++) c[b[i].l]=a[i].l;
msort(,n);
cout<<ans;
return ;
}
【NOIP2013】火柴排队 题解(贪心+归并排序)的更多相关文章
- LOJ2609. NOIP2013 火柴排队 【树状数组】
LOJ2609. NOIP2013 火柴排队 LINK 题目大意: 给你两个数列,定义权值∑i=1(ai−bi)^2 问最少的操作次数,最小化权值 首先需要发现几个性质 最小权值满足任意i,j不存在a ...
- [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)
[NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...
- [树状数组+逆序对][NOIP2013]火柴排队
火柴排队 题目描述 涵涵有两盒火柴,每盒装有n根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑ (ai-bi)2,i=1,2,3,. ...
- [NOIP2013] 火柴排队(归并排序)
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- noip2013火柴排队_Solution
要想对任意(ai,bi)和(aj和bj),当ai<aj时,都有bi<=bj:当ai>=aj时,bi>=bj,当对a进行升序排序后(b同时发生改变,从而不改变值,最后有a1& ...
- NOIP2013火柴排队[逆序对]
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- jzoj[1438]NOIP2013火柴排队
读题: 相邻两个火柴可以交换?两个火柴序列?嗅到了归并排序的味道. 读完题目之后,我们可以知道,如果想要交换次数最少,可以先固定一个序列不变,比如说a序列不变,变b序列 样例是 4 2 3 1 4 3 ...
- noip2013 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- 洛谷p1966火柴排队题解
ps:鉴于你们的蒟蒻yxj实在太蒻辽, 所以, 看不懂也是正常的........ 树状数组 xxy学姐给我们讲的树状数组, 她讲的真的是太好啦!qwq!吹爆xxy 然后, 为了巩固自己, 硬着头皮写题 ...
随机推荐
- JS学习研究
//1.undefined 是派生自null的 //alert(undefined == null); //alert(undefined === null); ////结果 true false / ...
- python 网络爬虫报错“UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position”解决方案
Python3.x爬虫, 发现报错“UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1:invalid sta ...
- scrapy 源码解析 (二):启动流程源码分析(二) CrawlerProcess主进程
CrawlerProcess主进程 它控制了twisted的reactor,也就是整个事件循环.它负责配置reactor并启动事件循环,最后在所有爬取结束后停止reactor.另外还控制了一些信号操作 ...
- hihoCoder 1049 后序遍历 最详细的解题报告
题目来源:后序遍历 解题思路:开始时我只知道先通过先序.中序求出二叉树,然后再后序遍历二叉树,这当然也是一种解题思路,但是会做一些无用功,比如:计算二叉树.其实,可以直接通过先序序列和中序序列直接求出 ...
- CSS-好玩的样式(用高斯模糊制作平缓突起)
一.效果图: 应用: 二.上代码 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- ResponseBodyAdvice如何处理返回值是字符串的问题
项目中使用ResponseBodyAdvice同一封装返回格式,对于一般的类型都没有问题,但是处理字符串时,遇到了类型转换的问题,debug一步一步跟踪,原来是对于字符串的ContentType是“t ...
- js:数组(创建、遍历、函数)
1.数组 采用单个变量只能存储一个数据,数组能够存储多个数据,获取方式也比较简单.它是将一组数据存储在当个变量下的存储方式. 2.数组的创建 (1)new方式创建,不指定数组长度 <script ...
- STL源码剖析:序列式容器
前言 容器,置物之所也.就是存放数据的地方. array(数组).list(串行).tree(树).stack(堆栈).queue(队列).hash table(杂凑表).set(集合).map(映像 ...
- sqlserver安装出现找不到数据库引擎错误
sqlserver安装出现找不到数据库引擎错误 问题的解决 第一次安装SQL server,发现它较于Oracle,都有安装卸载十分麻烦的特点.刚开始安装,就让我频繁遇到这个“找不到数据库引擎”的错误 ...
- xilinx fpga中块ram的使用——简单双端口ram的使用
在简单双端口ram中最简单有9个端口:分别是 clka 为输入端口的时钟 wea 读写控制端,高为写,低为读 addra 写地址 dina 待写入的数据 clkb 为输出端口的时钟的 addrb ...