[NOIP2013提高组]火柴排队
题目:洛谷P1966、Vijos P1842、codevs3286。
题目大意:有两排火柴,每根都有一个高度。设a、b分别表示两排火柴的高度,现在要令$\sum(a_i-b_i)^2$最小。现两排火柴已经排成一个序列,求最少交换多少次能满足条件。
解题思路:首先,只有当最大的对应最大的,次大的对应次大的,以此类推,得到的答案才可能最小。
然后我们发现,如此分析后,此题的答案与火柴实际长度无关,只要按照原来的大小顺序即可,且只需考虑对一排火柴进行交换即可。
因此我们对两组数据分别离散,然后通过第一组数据再对第二组数据再离散一遍即可。
最后其实就是求逆序对了,归并排序即可。
时间复杂度$O(n\log _2 n)$。
既然写了归并,还用什么sort(*^__^*)
C++ Code:
#include<cstdio>
#include<cstring>
using namespace std;
int n,a[100005],ans,b[100005],c[100005],ys[100005],p[100005];
void merge(int* a,int l,int r){
int i=l,mid=l+r>>1,k=l;
int j=mid+1;
while(i<=mid&&j<=r){
if(a[i]>a[j]){
ans=(ans+mid-i+1)%99999997;
c[k++]=a[j++];
}
else
c[k++]=a[i++];
}
while(i<=mid)c[k++]=a[i++];
while(j<=r)c[k++]=a[j++];
for(i=l;i<=r;++i)a[i]=c[i];
}
void mergesort(int* a,int l,int r){
if(l!=r){
int m=l+r>>1;
mergesort(a,l,m);
mergesort(a,m+1,r);
merge(a,l,r);
}
}
void merge_sort(int* a,int l,int r){
ans=0;
mergesort(a,l,r);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",&a[i]);
memcpy(p,a,sizeof p);
merge_sort(p,1,n);
for(int i=1;i<=n;++i)
ys[p[i]]=i;
for(int i=1;i<=n;++i)a[i]=ys[a[i]];
for(int i=1;i<=n;++i)scanf("%d",&b[i]);
memcpy(p,b,sizeof p);
merge_sort(p,1,n);
for(int i=1;i<=n;++i)
ys[p[i]]=i;
for(int i=1;i<=n;++i)b[i]=ys[b[i]];
for(int i=1;i<=n;++i)
ys[a[i]]=i;
for(int i=1;i<=n;++i)b[i]=ys[b[i]];
merge_sort(b,1,n);
printf("%d\n",ans);
return 0;
}
[NOIP2013提高组]火柴排队的更多相关文章
- [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路
[NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路 题目大意: 对于长度为\(n(n\le10^5)\)的非负数列\(A\),每次可以选取一个区间\(-1\).问将数列清零至少需要 ...
- [NOIP2013 提高组] 华容道 P1979 洛谷
[NOIP2013 提高组] 华容道 P1979 洛谷 强烈推荐,更好的阅读体验 经典题目:spfa+bfs+转化 题目大意: 给出一个01网格图,和点坐标x,y空格坐标a,b,目标位置tx,ty要求 ...
- 洛谷P1966 [NOIP2013提高组Day1T2]火柴排队
P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi) ...
- NOIP2013 提高组 Day1
https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%7C30 期望得分:100+100+100=300 实际得 ...
- [NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
一开始觉得是网络流..仔细一看应该是最短路,再看数据范围..呵呵不会写...这道题是最大生成树+最近公共祖先.第一次写..表示各种乱.. 因为要求运输货物质量最大,所以路径一定是在最大生成树上的.然后 ...
- 【NOIP2013提高组T3】加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
- noip2013 提高组
T1 转圈游戏 题目传送门 果不其然 第一题还是模拟题 一波快速幂解决问题 #include<cstdio> #include<cstring> #include<alg ...
- NOIP2013提高组 T2 火柴排队
一开始看也想不到这居然要用到逆序对,归并排序. 先来看看题目: 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间 ...
- 【NOIP2013提高组】火柴排队
https://www.luogu.org/problem/show?pid=1966 Σ(ai-bi)2=Σai2+Σbi2-2Σai*bi,要使Σ(ai-bi)2最小,则需2Σai*bi最大. 由 ...
随机推荐
- sql-查看执行计划的方法
sql执行计划:把SQL语句拆分为每个的操作步骤组合,按照一定的顺序执行得出结果,查看并看懂执行计划是调优的关键步骤 查看执行计划的方法 DBMS_XPLAN包 sql*plus AUTO trace ...
- 搭建python3环境
将Python2.7通过控制面板卸载,然后从网站下载python的安装包,安装即可. 安装beatifulsoup4库.在命令行下, pip install beautifulsoup4 千万不能在p ...
- SpringCloud学习笔记(14)----Spring Cloud Netflix之Hystrix对Feign的支持
1. Hystrix对Feign的支持 添加Feign中IUserBiz的实现类HystrixFallBack: package com.wangx.cloud.springcloud02consum ...
- 优动漫PAINT-超简单灌木教程
超简单灌木教程~零基础神马的都能神还原哦! 优动漫PAINT下载:http://wm.makeding.com/iclk/?zoneid=18597 想要Get到更多有关优动漫的信息包括软件下载,可关 ...
- css实现步骤条
实现效果 html <ul class="steps"> <li class="active">申请完成</li> < ...
- js各种验证
1. var Validate = function() { //账号验证 字母,数字,下划线,不能少于6位大于20位 this.isName =function(value){ var reg = ...
- java流与文件的操作 文件加密
课后作业 1,源代码 import java.io.*; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttribu ...
- mysql5.7 安装方法 (跟旧的不一样了)
MySQL 5.7发布之后很多网友都在说,打开想安装文件夹.但是文件夹中没有DATA目录, 没有mysqly默认库.启动不了数据库,那是因为5.7的数据库的初始化方法和之前的初始化不一样了. 首先这里 ...
- Unity 3D本地公布WebPlayer版时"Failed to download data file"解决方式
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlzZW55YW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- cocos2d-x 粒子效果
大规模运动的物体通常有两种方法实现 1.使用帧动画来模拟 2,粒子效果 粒子系统有CCParticleSystem类实现,CCParticleSystem实现了对粒子的控制与调度,对粒子的操作包含: ...