两列排序后将编号一一对应

归并排序求逆序对

(每一次交换就去掉一个逆序对)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define ll long long
 5 using namespace std;
 6 const int N=100100;
 7 const ll P=99999997;
 8 ll tmp[N],ss[N],ans,n;
 9 struct fx{
10     ll w;
11     int id;
12 }a[N],b[N];
13 bool cmp(fx p,fx q){
14     return p.w<q.w;
15 }
16 ll read(){
17     ll sum=0;
18     char ch=getchar();
19     while (ch<'0'||ch>'9')
20         ch=getchar();
21     while (ch>='0'&&ch<='9'){
22         sum=sum*10+ch-'0';
23         ch=getchar();
24     }
25     return sum;
26 }
27 void mergesort(int l,int r){
28     if(l==r)
29         return;
30     int m=(l+r)>>1;
31     mergesort(l,m);
32     mergesort(m+1,r);
33     int i=l;
34     int j=m+1;
35     int k=l;
36     while (i<=m&&j<=r){
37         if (ss[i]<ss[j]){
38             tmp[k]=ss[i];
39             i++;
40             k++;
41         }
42         else{
43             ans=(ans+m-i+1)%P;//区间内逆序对个数
44             tmp[k]=ss[j];
45             j++;
46             k++;
47         }
48     }
49     while (i<=m){
50         tmp[k]=ss[i];
51         k++;
52         i++;
53     }
54     while (j<=r){
55         tmp[k]=ss[j];
56         k++;
57         j++;
58     }
59     for (int i=l;i<=r;i++){
60         ss[i]=tmp[i];
61     }
62 }
63 int main(){
64     ans=0;
65     n=read();
66     for (int i=1;i<=n;i++){
67         a[i].w=read();
68         a[i].id=i;
69     }
70     for (int i=1;i<=n;i++){
71         b[i].w=read();
72         b[i].id=i;
73     }
74     sort(a+1,a+n+1,cmp);
75     sort(b+1,b+n+1,cmp);
76     for (int i=1;i<=n;i++)
77         ss[a[i].id]=b[i].id;
78     mergesort(1,n);
79     printf("%lld",ans%P);
80     return 0;
81 }

STD

转载于:https://www.cnblogs.com/Absolute-Zero/p/6013878.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 火柴排队

    题意 给定2个等长序列a.b,要求通过交换使 \[\sum_{i=1}^{n}(a_i-b_i)^2\] 最小. 分析 看着这个式子,我突然想到了方差.很明显,方差反应数据的波动程度,所以让数据集中就 ...

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

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

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

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

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

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

  8. P1966 火柴排队题解

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

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

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

最新文章

  1. java应用窗口大小_java 如何让程序窗口随屏幕大小改变 | 学步园
  2. ## **scrapy+kafka+sparkstream爬取京东Iphone12评论储存数据**
  3. debian下编译安装poco
  4. 嵌套中断共享资源问题及解决
  5. C语言以递归实现归并排序Merge Sort算法(附完整源码)
  6. 理解云计算备份与灾难恢复
  7. cobertura覆盖率_Cobertura和Maven:集成和单元测试的代码覆盖率
  8. centos 安装jdk_centos7配置jdk
  9. 中props使用this报错_为什么在静态方法中不能使用this
  10. NUC1214 回文素数
  11. word 远程过程调用失败。 (异常来自 HRESULT:0x800706BE) 解决方法
  12. 使用说明_无线投屏器使用说明教程
  13. 曲面化原理创新设计_女裤制版要多久创新服务
  14. 自制一个简单的操作系统
  15. 微软sccm服务器,微软SCCM是什么?
  16. C. The Intriguing Obsession(神仙组合数)
  17. nodejs-CentOS64下载安装配置
  18. 数组测验1 7-5 冒泡法排序 (20 分)
  19. android水印控件,Android图片添加文字水印并保存水印文字图片到指定文件
  20. 用python写个根据提示猜词语简单的游戏_python实现简单猜单词游戏

热门文章

  1. python access_Python3 os.access() 方法
  2. html文档主体的根标签,2 HTML简介标签嵌套和并列关系文档声明
  3. 群晖按装mysql_如何连接群晖里的MYSQL数据库
  4. python web.py 404_找不到web.py开发服务器-favicon.ico-404
  5. 户籍恢复需要体检吗_脑梗死后脚麻能恢复吗?需要多久能恢复呢?
  6. 得到前i-1个数中比A[i]小的最大值,使用set,然后二分查找
  7. 【C++grammar】代理构造、不可变对象、静态成员
  8. python 初始化 元组_在Python中重新初始化元组
  9. 09-CNN手写数字识别
  10. PHP的数据类型、浮点型比较