【a703】求逆序对
Time Limit: 10 second
Memory Limit: 2 MB
问题描述
给定一个序列a1,a2...an。如果存在i小于j 并且ai大于aj,那么我们称之为逆序对,求给定序列中逆序对的数目
Input
第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。
Output
所有逆序对的总数
Sample Input
4
3
2
3
2
Sample Output
3
【题解】
在进行归并排序的同时求逆序对。
我们在进行归并排序时。
分成l..mid和mid+1..r
假设左边循环变量为i,右边的循环变量为j。
则当我们找到一个i和j满足a[i] > a[j]时。
因为左边,右边都是有序的,则a[i+1..mid]都大于a[j];
而之后我们会吧a[j]加入到temp数组中,此后a[j]不再出现。
则逆序对的数目增加mid-i+1;
然后逆序对数目用数据范围大的类型存储就好了。
【代码】
#include <cstdio> int n,a[100009],temp[100009];
double tot = 0; void input_data()
{
scanf("%d",&n);
for (int i = 1;i <= n;i++)
scanf("%d",&a[i]);
} void mergesort(int l,int r) //对区间[l,r]进行分割
{
if (l == r) return; //只剩一个元素则认为其是有序的。
int mid = (l+r)/2; //获取中间的位置
mergesort(l,mid);mergesort(mid+1,r); //将这个位置的左边和右边进行不断切割。
int i = l,j = mid+1,k = l;
while (i <= mid && j <= r) //开始进行二路归并。
if (a[i] <= a[j]) //比较小的数放到temp数组中去
temp[k++] = a[i++];
else //在排序的同时顺便求逆序对
{
tot+=mid-i+1;
temp[k++] = a[j++];
}
while (i <= mid)
temp[k++] = a[i++];
while (j <= r) //剩下相同的数字也要放进temp数组
temp[k++] = a[j++];
for (int w = l;w<=r;w++) //最后再把temp数组赋值给原数组
a[w] = temp[w];
} void output_ans()
{
printf("%.0lf",tot);
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
input_data();
mergesort(1,n);
output_ans();
return 0;
}
【a703】求逆序对的更多相关文章
- 【a703】求逆序对(树状数组的解法)
Time Limit: 10 second Memory Limit: 2 MB 问题描述 给定一个序列a1,a2...an.如果存在i小于j 并且ai大于aj,那么我们称之为逆序对,求给定序列中逆序 ...
- HDU 3743 Frosh Week(归并排序求逆序对)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3743 题目意思就是给你一个长为n的序列,让你求逆序对.我用的是归并排序来求的.归并排序有一个合并的过程 ...
- AC日记——codevs 1688 求逆序对
1688 求逆序对 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 给定一个序列a1,a2,…, ...
- POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)
树状数组求逆序对 转载http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 转载: 树状数组,具体的说是 离散化+树 ...
- codevs1688 求逆序对
题目描述 Description 给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目 数据范围:N<=105.Ai<=105. ...
- HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少 ...
- SGU 180 Inversions(离散化 + 线段树求逆序对)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...
- 树状数组求逆序对:POJ 2299、3067
前几天开始看树状数组了,然后开始找题来刷. 首先是 POJ 2299 Ultra-QuickSort: http://poj.org/problem?id=2299 这题是指给你一个无序序列,只能交换 ...
- wikioi 1688 求逆序对
/*=========================================================== wikioi 1688 求逆序对 时间限制: 1 s 空间限制: 12800 ...
随机推荐
- jquery中prop()和attr()的使用
jquery1.6+出现的prop()方法. • 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. • 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法. • ...
- 洛谷 P1808 单词分类_NOI导刊2011提高(01)
P1808 单词分类_NOI导刊2011提高(01) 题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且仅当 ...
- j2ee,jsp,servlet文件下载server端
1.getOutputStream() has already been called for this response 报错的原因: 使用tomcat容器调用response.getOutputS ...
- c编程:僵尸吃大脑
第一行输入一个正整数n 以下每一行输入僵尸已经吃了的大脑数量a,和需要生存必需要吃的大脑数量b.总共n行. 例子输入 3 4 5 3 3 4 3 例子输出 NO BRAINS MMM BRAINS M ...
- Python 实用第三方库
1. youtube 视频下载 使用:you-get pip install you-get you-get 'https://www.youtube.com/watch?v=jNQXAC9IVRw'
- Altium Designer如何设置pcb尺寸
- 定制表格头, 学习Core Graphic 的第二部分, 阴影与玻璃效果.
//定制表格头, 学习Core Graphic 的第二部分, 阴影与玻璃效果. https://github.com/comcuter/testsnippets/commit/e96f62d115ef ...
- 3D游戏《龙心传奇Dragona》全套完整源码
<龙心传奇Dragona>全套完整源码,<Dragona Online>也叫<龙心传奇>是一款3D中古奇幻风格网络游戏,描写叙述一个充满剑.魔法.恶魔和龙的魔法大陆 ...
- cURL(wget)—— 测试 RESTful 接口及模拟 GET/POST/PUT/DELETE/OPTIONS 请求
cURL 是一个简单的 http 命令行工具.与最优秀的 Unix 工具一样,在设计之时,cURL 是个小型程序,功能十分专一,而且是故意为之,仅用于访问 http 服务器.(在 Linux 中,可以 ...
- Intel X86 CPU 系列的寻址方式
Intel X86 CPU 系列的寻址方式 数据总线和地址总线要尽量相同,这个是一个地址就是一个指针.