洛谷 P1966 火柴排队 题解
归并排序
很玄学的一道题目,用另类的方法求出逆序对的数量就可以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 火柴排队 题解的更多相关文章
- [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)
[NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...
- 洛谷p1966火柴排队题解
ps:鉴于你们的蒟蒻yxj实在太蒻辽, 所以, 看不懂也是正常的........ 树状数组 xxy学姐给我们讲的树状数组, 她讲的真的是太好啦!qwq!吹爆xxy 然后, 为了巩固自己, 硬着头皮写题 ...
- 【刷题】洛谷 P1966 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- 洛谷 P1966 火柴排队 解题报告
P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: \(\s ...
- 洛谷——P1966 火柴排队&&P1774 最接近神的人_NOI导刊2010提高(02)
P1966 火柴排队 这题贪心显然,即将两序列中第k大的数的位置保持一致,证明略: 树状数组求逆序对啦 浅谈树状数组求逆序对及离散化的几种方式及应用 方法:从前向后每次将数插入到bit(树状数组)中, ...
- [洛谷P1966] 火柴排队
题目链接: 火柴排队 题目分析: 感觉比较顺理成章地就能推出来?似乎是个一眼题 交换的话多半会往逆序对上面想,然后题目给那个式子就是拿来吓人的根本没有卵用 唯一的用处大概是告诉你考虑贪心一波,很显然有 ...
- 洛谷 P1966 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:∑(ai−bi)2 其中ai 表示 ...
- 洛谷 P1966 火柴排队 —— 思路
题目:https://www.luogu.org/problemnew/show/P1966 首先,一个排列相邻交换变成另一个排列的交换次数就是逆序对数: 随便画一画,感觉应该是排个序,大的对应大的, ...
- 洛谷——P1966 火柴排队
https://www.luogu.org/problem/show?pid=1966 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列 ...
随机推荐
- 如何将 Redis 用于微服务通信的事件存储
来源:Redislabs作者:Martin Forstner 翻译:Kevin (公众号:中间件小哥) 以我的经验,将某些应用拆分成更小的.松耦合的.可协同工作的独立逻辑业务服务会更易于构建和维护.这 ...
- kafka和zookeeper安装部署(版本弄不好就是坑)
yum install -y unzip zip 配置host vi /etc/host172.19.68.10 zk1 1. zookeeper zookeeper下载地址 http://mirro ...
- [UOJ #140]【UER #4】被粉碎的数字
题目大意:定义$f(x)$为数字$x$每一位数字的和,求$\sum\limits_{i=1}^R[f(x)=f(kx)]$.$R\leqslant10^{18},k\leqslant10^3$ 题解: ...
- LOJ3120 CTS2019 珍珠 生成函数、二项式反演、NTT
传送门 题目大意:给出一个长度为\(n\)的序列\(a_i\),序列中每一个数可以取\(1\)到\(D\)中的所有数.问共有多少个序列满足:设\(p_i\)表示第\(i\)个数在序列中出现的次数,\( ...
- 全栈项目|小书架|微信小程序-首页水平轮播实现
首页效果 首页功能主要有 搜索(下篇文章介绍) 图书列表 图书列表 分析一波: 列表是水平滑动 点击列表会有按压效果:布局整体缩小 每个布局的信息从上到下排列分别是:图片.书名.作者.出版社 每个布局 ...
- lucene中Field简析
http://blog.csdn.net/zhaoxiao2008/article/details/14180019 先看一段lucene3代码 Document doc = new Document ...
- Java电商项目,秒杀,抢购等高并发场景的具体场景和一些概念以及处理思路
这里我借鉴了网上其他大佬的观点: 一:高并发带来的挑战 原因:秒杀抢购会经常会带来每秒几万的高并发场景,为了更快的返回结果给用户. 吞吐量指标QPS(每秒处理请求数),假设一个业务请求响应耗时为100 ...
- 织梦dedecms是什么?
织梦dedecms是什么?DedeCms是织梦内容管理系统(DedeCms)的简称, 以简单.实用.开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统; DedeC ...
- git提交代码并将develop分支合并到master分支上
提交合并代码流程: git add .git commit -m ''git pushgit checkout mastergit merge develop //将develop 分支与master ...
- js javascirpt 数学库、 算法库 (转载)
提示:国外官网,谷歌浏览器右键可以翻译成中文. 1.math.js 官网:https://mathjs.org/index.html 其它简介:https://www.jianshu.com/p/4f ...