noip2013 火柴排序
涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:

,其中 ai 表示第一列火柴中第 i 个火柴的高度,bi 表示第二列火柴中第 i 个火柴的高度。
每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果。
intput:
4
2 3 1 4
3 2 1 4
output:
1
思路:
先开一个结构体,然后输入。按照v的大小升序排序。
const int maxn=;
struct cyc
{
int V,id;
}a[maxn],b[maxn];
然后,将a中元素对应b的的位置储存到c。
最后,归并排序即可。
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<queue>
using namespace std;
const int maxn=,lln=;
struct cyc
{
int v,id;
}a[maxn],b[maxn];
int n;
int c[maxn],d[maxn];
int ans=;
bool myc(cyc x,cyc y)
{
return x.v<y.v;
}
void work(int l,int r)
{
int mid,tmp,i,j;
if(l+<r)
{
mid=(l+r)/;
work(l,mid-);
work(mid,r);
tmp=l;
for(i=l,j=mid;i<=mid-&&j<=r;)
{
if(c[i]>c[j])
{
d[tmp++]=c[j++];
ans=1LL*(ans+mid-i)%lln;
}
else
{
d[tmp++]=c[i++];
}
}
if(j<=r)
{
for(;j<=r;j++) d[tmp++]=c[j];
}
else
{
for(;i<=mid-;i++) d[tmp++]=c[i];
}
for(i=l;i<=r;i++)
c[i]=d[i];
}
else{
if(l+==r)
{
if(c[l]>c[r])
{
swap(c[l],c[r]);
ans=1LL*(ans+)%lln;
}
}
}
}
int main()
{
/*freopen("2.in","r",stdin);
freopen("2.out","w",stdout);*/
//ios::sync_with_stdio(false);
cin>>n;
for(int i=;i<=n;i++)
{
cin>>a[i].v;
a[i].id=i;
}
for(int i=;i<=n;i++)
{
cin>>b[i].v;
b[i].id=i;
}
sort(a+,a++n,myc);
sort(b+,b++n,myc);
for(int i=;i<=n;i++)
c[b[i].id]=a[i].id;
work(,n);
cout<<ans<<endl;
return ;
}
noip2013 火柴排序的更多相关文章
- LOJ2609. NOIP2013 火柴排队 【树状数组】
LOJ2609. NOIP2013 火柴排队 LINK 题目大意: 给你两个数列,定义权值∑i=1(ai−bi)^2 问最少的操作次数,最小化权值 首先需要发现几个性质 最小权值满足任意i,j不存在a ...
- NOIP2013火柴排队[逆序对]
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- [NOIP2013] 火柴排队(归并排序)
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- noip2013 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- jzoj[1438]NOIP2013火柴排队
读题: 相邻两个火柴可以交换?两个火柴序列?嗅到了归并排序的味道. 读完题目之后,我们可以知道,如果想要交换次数最少,可以先固定一个序列不变,比如说a序列不变,变b序列 样例是 4 2 3 1 4 3 ...
- noip2013火柴排队_Solution
要想对任意(ai,bi)和(aj和bj),当ai<aj时,都有bi<=bj:当ai>=aj时,bi>=bj,当对a进行升序排序后(b同时发生改变,从而不改变值,最后有a1& ...
- NOIP2013火柴排队
Solution 恕我直言,这题是真的坑. 对于这道题,一个很显然的思路是对于A B两个序列,他们交换完后相对的两个数在原序列中的相对大小是相同的,于是我们就把序列按照A排序,在把B离散化,求逆序对, ...
- [树状数组+逆序对][NOIP2013]火柴排队
火柴排队 题目描述 涵涵有两盒火柴,每盒装有n根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑ (ai-bi)2,i=1,2,3,. ...
- NOIp2013 火柴排队【逆序对/思维】 By cellur925
题目大意:给你两列数\(ai\)和\(bi\),你可以交换每列数中相邻的两个数,求一个最小交换次数使\(\sum_{i=1}^{n}(a_i-b_i)^2\) 最小. 最后满足条件的两个序列一定是各个 ...
随机推荐
- JPA入门案例详解(附源码)
1.新建JavaEE Persistence项目
- 《BI那点儿事》数据流转换——模糊分组转换
在模糊查找中我们提到脏数据是怎样进入到表中的事情,主要还是由于一些“Lazy-add”造成的.这种情况我们的肉眼很容易被欺骗,看上去是同一个单词,其实就差那么一个字母,变成了两个不同的单词.一个简单的 ...
- ARM处理器的寄存器
在ARM体系中通常有以下3种方式控制程序的执行流程: **在正常执行过程中,每执行一条ARM指令,程序计数器(PC)的值加4个字节:每执行一条Thumb指令,程序计数器寄存器(PC)加2个字节.整个过 ...
- Html5 Canvas核心技术(图形,动画,游戏开发)--基础知识
基础知识 canvas 元素可以说是HTML5元素中最强大的一个,他真正的能力是通过canvas的context对象表现出来的.该环境对象可以从canvas元素身上获得. <body> & ...
- TCP/IP协议学习(四) 协议概述
生活中有舒适区,借口成为懒惰的护身符,学习也有舒适区,逃避便是阻止进步的最大障碍. 经过半年多嵌入式方面的工作和学习,我提高了很多,但同时我也对自己所面临的问题逐渐清晰: 1. 偏于实践,理论基础不牢 ...
- windows+linux开发环境 解决laravel blade模板缓存问题
编码环境windows10 编码IDE:phpstorm 2016.2 PHP框架:laravel5.3 + 代码运行环境:centos7 + nginx 在开发过程中,上传blade模板文件到lin ...
- spring+mybatis
---恢复内容开始--- 使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地 ...
- C 风格字符串和strcpy方法的实现
C语言是面向过程的,所以它并没有所谓封装好的功能强大的string.但是麻雀虽小五脏俱全.在C中,我们一般用 const char* 类型来定义一个字面型字符串. 首先我们了解下C中的基本指针.指针是 ...
- qt5.4.0在windows,32位下的编译, vs2010平台
假设源代码入在D:\3DFrame\qt-everywhere-opensource-src-5.4.0\qt-everywhere-opensource-src-5.4.0 1:首先从官方网站下载源 ...
- 读javascript高级程序设计13-JSON
JSON是一个轻量级的数据格式,可以简化表示数据结构的工作量.在实际工作中,我们经常用它来传递数据,不过对于其使用的一些细节还是需要注意的.在ECMAScript5中定义了原生的JSON对象,可以用来 ...