归并排序

很玄学的一道题目,用另类的方法求出逆序对的数量就可以AC

我的思路是这样的:

按照题目,输入数据用两个数组a,b储存,

同时,用另外两个数组c,d分别对应前面两个a,b储存,

就是前面两个的复制

然后在将复制出来的拍一下序,

用另一个类似桶的分别记录在a,b两个数组的数字里面,

某一个数是里面第几大的数

然后按照b里面的顺序,也就是里面的从第一个到最后一个的数在桶里面对应的

是第几个

给a标一下第一第二

比如b中的顺序是 :1 , 3 , 2 , 4

在a中的顺序是 :1 , 4 , 2 , 3

那么根据b的来看,1在b中是第一个所以a中的1对应的还是1

3在b中是第二个,所以a中3对应的是2

.....

这样弄完之后

a成了1 , 4 , 3 , 2

然后归并排序

这里为什么可以用归并排序呢?

归并排序板子是按照大小来排序的,这里却是将a按照b来排序的

所以b就可以看作是大小,是将a在b中的位置看做是大小,这样归并排序按照改

完后的大小排一下

同时记录逆序对,也就是每一个需要挪动的次数

记录和,这个和就是需要挪动的次数的总和

完整代码

#include<iostream>
#include<cstdio>
#include<algorithm> using namespace std; const int Max = 100005;
const int mo = 99999997;//注意必须要mo一旦忽视就会错掉两个点
int a[Max],b[Max];
int c[Max],d[Max];
int num1[Max],num2[Max];
int js[Max];
long long ans = 0; int aa[Max];
void gui(int x,int y)//归并排序板子
{
if(x == y)return;
int mid = (x + y) >> 1;
gui(x,mid);gui(mid + 1,y);
int i = x,j = mid + 1;
int k = x;
while(i <= mid && j <= y)
{
if(a[i] <= a[j])aa[k ++] = a[i ++];
else aa[k ++] = a[j ++],ans += mid - i + 1,ans %= mo;;
}
while(i <= mid)
aa[k ++] = a[i ++];
while(j <= y)
aa[k ++] = a[j ++];
for(int i = x;i <= y;++ i)
a[i] = aa[i];
} int main()
{
int n;
scanf("%d",&n);
for(int i = 1;i <= n;++ i)scanf("%d",&a[i]),c[i] = a[i];
for(int i = 1;i <= n;++ i)scanf("%d",&b[i]),d[i] = b[i];//输入数据
sort(d + 1,d + 1 + n);
for(int i = 1;i <= n;++ i)
num1[d[i]] = i;
sort(c + 1,c + 1 + n);
for(int i = 1;i <= n;++ i)
num2[c[i]] = i;
for(int i = 1;i <= n;++ i)
js[num1[b[i]]] = i;
for(int i = 1;i <= n;++ i)
a[i] = js[num2[a[i]]];//前面这一大坨都是预处理下标
gui(1,n);
cout << ans % mo <<endl;
return 0;
}

洛谷 P1966 火柴排队 题解的更多相关文章

  1. [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)

    [NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...

  2. 洛谷p1966火柴排队题解

    ps:鉴于你们的蒟蒻yxj实在太蒻辽, 所以, 看不懂也是正常的........ 树状数组 xxy学姐给我们讲的树状数组, 她讲的真的是太好啦!qwq!吹爆xxy 然后, 为了巩固自己, 硬着头皮写题 ...

  3. 【刷题】洛谷 P1966 火柴排队

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

  4. 洛谷 P1966 火柴排队 解题报告

    P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: \(\s ...

  5. 洛谷——P1966 火柴排队&&P1774 最接近神的人_NOI导刊2010提高(02)

    P1966 火柴排队 这题贪心显然,即将两序列中第k大的数的位置保持一致,证明略: 树状数组求逆序对啦 浅谈树状数组求逆序对及离散化的几种方式及应用 方法:从前向后每次将数插入到bit(树状数组)中, ...

  6. [洛谷P1966] 火柴排队

    题目链接: 火柴排队 题目分析: 感觉比较顺理成章地就能推出来?似乎是个一眼题 交换的话多半会往逆序对上面想,然后题目给那个式子就是拿来吓人的根本没有卵用 唯一的用处大概是告诉你考虑贪心一波,很显然有 ...

  7. 洛谷 P1966 火柴排队

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

  8. 洛谷 P1966 火柴排队 —— 思路

    题目:https://www.luogu.org/problemnew/show/P1966 首先,一个排列相邻交换变成另一个排列的交换次数就是逆序对数: 随便画一画,感觉应该是排个序,大的对应大的, ...

  9. 洛谷——P1966 火柴排队

    https://www.luogu.org/problem/show?pid=1966 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列 ...

随机推荐

  1. List集合String字符串按照汉语拼音排序

    public static void main(String[] args) { List<Map<String, Object>> mapList = new ArrayLi ...

  2. TypeScript之枚举

    什么是枚举类型,有什么作用? 枚举类型就是一个用来组织一些有相似之处的常量的对象,作用就是管理常量,让常量更规范,统一.例: enum Direction { Up = 1, Down, Left, ...

  3. Python 获取本月的最后一天

    一.需求 现在有一个场景,需要每月的最后一天,发送一封邮件. 二.获取本月最后一天 有没有办法使用Python的标准库轻松确定(即一个函数调用)给定月份的最后一天? 答案是有的,使用 datetime ...

  4. 14-2 SQL语言简介

    1.结构化查询语言(Structured Query Language,SQL),常被读作sequel,最初是由Microsoft.Sybase和Ashton-Tate这3家公司共同开发的. 2.Wi ...

  5. Python之TensorFlow的卷积神经网络-5

    一.卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度 ...

  6. postman 测试Api接口注意事项

    1.简单数据传输 2.对象传输 使用的是post方式请求 在Headers设置: 在Body写入对象信息,主要红线的地方:1.raw选中 2.j'son格式 form表单提交数据测试 在header里 ...

  7. Python学习日记(七) 文件操作

    文件操作: 首先要有一个文件作为对象,例‘文件名’.txt 1.文件路径:例 d:\文件名.txt <1>:绝对路径:从根目录往后的路径 <2>:相对路径:当前目录下的路径有什 ...

  8. 【zookeeper】linux中编写脚本批量启动zookeeper

    实现功能:一键启动.关闭主从端3个节点上的zookeeper,附加查看启动状态 mkdir bin --新建文件夹 cd bin 跳转到bin文件夹里 touch zookeeperstart.sh ...

  9. MySQL之Prepared Statements

    1.概述 prepared statement在MySQL4.1中引进并且增加了一些新的命令: COM_STMT_PREPARE COM_STMT_EXECUTE COM_STMT_CLOSE COM ...

  10. requests-html模块(下)

    render方法 我们先理一下关系requests和的作者是同一个人,pyppeteer是nodejs中puppeteer的非官方实现 requests-html调用的pyppeteer与浏览器进行交 ...