如果没有这道题的话我连逆序对是啥都不知道QAQ

原题:

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

,其中 ai 表示第一列火柴中第 i 个火柴的高度,bi 表示第二列火柴中第 i 个火柴的高度。
每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果。

1 ≤ n ≤ 100,000,0 ≤火柴高度≤ 2^31-1。

首先根据距离定义式可以看粗来,让距离最小,就是让第一列中的第k小的火柴和第二列中的第k小的火柴对齐,而且只能相邻的两个交换,这就是个冒泡

冒泡排序中,如果要把序列排成升序,呢么如果存在i<j && a[i]>a[j],呢么a[i]和a[j]一定要交换,因为a[i]要往右走,a[j]要往左走

定义id为a排序前的位置,数组c为a[i].id对应的b[i].id,呢么就是求c中的逆序对个数,即让两列中第k小的火柴对齐需要的最小交换次数

归并求逆序对即可

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. int read(){int z=,mark=; char ch=getchar();
  8. while(ch<''||ch>''){if(ch=='-')mark=-; ch=getchar();}
  9. while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
  10. return z*mark;
  11. }
  12. int mo=;
  13. int n;
  14. struct cdd{int num,id;}a[],b[];
  15. int c[];
  16. int d[],dtou=;
  17. int bowl=;
  18. bool compare(cdd x,cdd y){return x.num<y.num;}
  19. void bing(int _left,int _right){
  20. int mid=(_left+_right)/; dtou=_left-;
  21. int i=_left,j=mid+;
  22. while(i<=mid && j<=_right){
  23. if(c[j]<c[i]){ d[++dtou]=c[j++]; bowl=(bowl+mid-i+)%mo;}
  24. else d[++dtou]=c[i++];
  25. }
  26. while(i<=mid) d[++dtou]=c[i++];//序列是单调的,所以后面的肯定也都大于前面的
  27. while(j<=_right) d[++dtou]=c[j++];
  28. for(int i=_left;i<=_right;i++)
  29. c[i]=d[i];
  30. }
  31. void gui(int _left,int _right){
  32. if(_left<_right){
  33. int mid=(_left+_right)/;
  34. gui(_left,mid),gui(mid+,_right);
  35. bing(_left,_right);
  36. }
  37. }
  38. int main(){//freopen("ddd.in","r",stdin);
  39. cin>>n;
  40. for(int i=;i<=n;i++) a[i].num=read(),a[i].id=i;
  41. for(int i=;i<=n;i++) b[i].num=read(),b[i].id=i;
  42. sort(a+,a+n+,compare),sort(b+,b+n+,compare);
  43. for(int i=;i<=n;i++) c[a[i].id]=b[i].id;
  44. gui(,n);
  45. /*for(int i=1;i<=n;i++) cout<<c[i]<<" ";
  46. cout<<endl;*/
  47. cout<<bowl<<endl;
  48. return ;
  49. }

【NOIP2013】火柴排队的更多相关文章

  1. LOJ2609. NOIP2013 火柴排队 【树状数组】

    LOJ2609. NOIP2013 火柴排队 LINK 题目大意: 给你两个数列,定义权值∑i=1(ai−bi)^2 问最少的操作次数,最小化权值 首先需要发现几个性质 最小权值满足任意i,j不存在a ...

  2. [树状数组+逆序对][NOIP2013]火柴排队

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

  3. NOIP2013火柴排队[逆序对]

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

  4. [NOIP2013] 火柴排队(归并排序)

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

  5. noip2013 火柴排队

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

  6. jzoj[1438]NOIP2013火柴排队

    读题: 相邻两个火柴可以交换?两个火柴序列?嗅到了归并排序的味道. 读完题目之后,我们可以知道,如果想要交换次数最少,可以先固定一个序列不变,比如说a序列不变,变b序列 样例是 4 2 3 1 4 3 ...

  7. noip2013火柴排队_Solution

    要想对任意(ai,bi)和(aj­和b­j),当ai<aj时,都有bi<=bj:当ai>=aj时,bi>=bj,当对a进行升序排序后(b同时发生改变,从而不改变值,最后有a1& ...

  8. NOIP2013火柴排队

    Solution 恕我直言,这题是真的坑. 对于这道题,一个很显然的思路是对于A B两个序列,他们交换完后相对的两个数在原序列中的相对大小是相同的,于是我们就把序列按照A排序,在把B离散化,求逆序对, ...

  9. NOIp2013 火柴排队【逆序对/思维】 By cellur925

    题目大意:给你两列数\(ai\)和\(bi\),你可以交换每列数中相邻的两个数,求一个最小交换次数使\(\sum_{i=1}^{n}(a_i-b_i)^2\) 最小. 最后满足条件的两个序列一定是各个 ...

  10. NOIP 2013 火柴排队

    洛谷 P1966 火柴排队 洛谷传送门 JDOJ 2227: [NOIP2013]火柴排队 D1 T2 JDOJ传送门 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高 ...

随机推荐

  1. C++指针详解(二)

    指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一.利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯:指针能 ...

  2. MongoDB的安装、配置服务(转)

      一,简介  MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.  MongoDB是一个高性能,开源,无模式的文档型数据库,是当前 ...

  3. <转>thinkphp自动验证无效的问题

    新手入门thinkphp,试用自动验证表单输入数据功能,却发现怎么都不能调用自动验证,自动验证无效,原因竟是一个小细节的疏忽,学习一定要细心啊! Action方法: IndexAction下的adds ...

  4. META标签的NAME变量

    META标签的NAME变量语法格式是: <META NAME=xxx CONTENT=xxxxxxxxxxxxxxxxxx> 其中xxx主要有下面几种参数: 1. Keywords(关键字 ...

  5. 解决:insert Vodafone sim card,open the mms read report,when receive the read report,cann't download..

    insert Vodafone sim card,open the mms read report,when receive the read report,cann't download the m ...

  6. Design Patterns---- Strategy 模式

    设计模式:可复用面向对象软件的基础 书中对 Strategy 模式的定义如下: 定义了一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于它的用户而变化. 案例:设计一个商 ...

  7. ERP员工入职登记(五)

    在数据库中添加链接的地址:

  8. Java 集合深入理解(12):古老的 Vector

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天刮台风,躲屋里看看 Vector ! 都说 Vector 是线程安全的 ArrayList,今天来根据源码看看是不是这 ...

  9. Android启动组件的三种主流及若干非主流方式

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处 启动组件的一些方式,今天做一个简要的总结 Service:通过startService()启动,或者写 ...

  10. why we need virtual key word

    http://stackoverflow.com/questions/2391679/why-do-we-need-virtual-methods-in-c 简言之,声明基类时,而实际指向派生类.如果 ...