三部曲一(数据结构)-1020-Ultra-QuickSort
通过这道题我大体理解了树状数组的原理和用法,完全用的别人的算法,我把别人算法看懂之后有自己敲了一遍,不得不说这算法真是高深巧妙啊,我开始看都看不懂,还是在别人的讲解下才看懂的,我觉得有必要写个博客记录一下。
算法先将所有数字离散化,按原来的大小关系从1一直到n。开始c数组的值全为零,每次插入一个数就将那一位的数组加一,并记录它和它前面的的数的和,即正序数+1,求得正序数之后,已插入的数的个数减去sum就是逆序数,最后把所有逆序数的和加起来,如一组数列
7 2 8 3 5
依次插入各个数
开始 0 0 0 0 0 0 0 0
插入7 0 0 0 0 0 0 1 0 sum=1 sum_reverse=0
插入2 0 1 0 0 0 0 1 0 sum=1 sum_reverse=1
插入8 0 1 0 0 0 0 1 1 sum=3 sum_reverse=0
插入3 0 1 1 0 0 0 1 1 sum=2 sum_reverse=2
插入5 0 1 1 0 1 0 1 1 sum=3 sum_reverse=2
求得逆序数为5
具体实现用树状数组,实现,每次插入一个数都要更新它上面的数。
代码如下
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std; int b[500001],c[500001],n; struct node
{
int val,id;
}num[500001]; bool cmp(const node n1,const node n2)
{
return n1.val<n2.val;
} int lowbit(int x)
{
return x&(-x);
} int update(int i,int x)
{
while(i<=n)
{
c[i]+=x;
i+=lowbit(i);
}
} int sum(int i)
{
int s=0;
while(i>0)
{
s+=c[i];
i-=lowbit(i);
}
return s;
} int main()
{
// freopen("in.txt","r",stdin);
int i;
long long ans;
while(scanf("%d",&n)!=EOF&&n)
{
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(i=0;i<n;i++)
{
scanf("%d",&num[i].val);
num[i].id=i;
}
sort(num,num+n,cmp);
b[num[0].id]=1;
// for(i=0;i<n;i++)
// cout<<num[i].id<<' ';
// cout<<endl;
for(i=1;i<n;i++)
{
if(num[i].val!=num[i-1].val)
b[num[i].id]=i+1;
else
b[num[i].id]=b[num[i-1].id];
}
//// for(i=0;i<n;i++)
//// cout<<b[i]<<' ';
//// cout<<endl;
ans=0;
for(i=0;i<n;i++)
{
update(b[i],1);
ans+=(sum(n)-sum(b[i])); }
printf("%I64d\n",ans);
}
}
三部曲一(数据结构)-1020-Ultra-QuickSort的更多相关文章
- 三部曲一(数据结构)-1024-Eqs
解方程整数解的题,通过这道题我学会了这种题的一般做法,对于未知数较少.取值范围较小且解为整数的方程,把一半的未知数移到等式的另一边,然后对两边分别枚举,用哈希配对,如果有相同的结果就找到一组解.具体做 ...
- 三部曲一(数据结构)-1022-Gold Balanced Lineup
Gold Balanced Lineup Time Limit : 4000/2000ms (Java/Other) Memory Limit : 131072/65536K (Java/Othe ...
- 三部曲一(数据结构)-1011-Sorting It All Out
每次加入一个关系都要进行拓扑排序,不过在排序过程中需要判断是否出现多个入度为0的点,如果出现了就说明不能确定大小关系.不论出不出现多个入度为0的点拓扑排序都要进行到最后来判断是否出现环,因为一旦出现环 ...
- Big O Complexity Graph
Big O Complexity Graph Big O === O() 算法复杂度速查表 数据结构 数组排序算法 Quicksort O(n log(n)) O(n log(n)) O(n^2) O ...
- C#数据结构与算法系列(二十二):快速排序算法(QuickSort)
1.介绍 快速排序(QuickSort)是对冒泡排序的一种改进,基本思想是:通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数 ...
- 数据结构与算法 Big O 备忘录与现实
不论今天的计算机技术变化,新技术的出现,所有都是来自数据结构与算法基础.我们需要温故而知新. 算法.架构.策略.机器学习之间的关系.在过往和技术人员交流时,很多人对算法和架构之间的关系感 ...
- 数据结构(DataStructure)与算法(Algorithm)、STL应用
catalogue . 引论 . 数据结构的概念 . 逻辑结构实例 2.1 堆栈 2.2 队列 2.3 树形结构 二叉树 . 物理结构实例 3.1 链表 单向线性链表 单向循环链表 双向线性链表 双向 ...
- WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...
- 翻阅《数据结构与算法javascript描述》--数组篇
导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...
随机推荐
- Cable TV Network-POJ1966图的连通度
Cable TV Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4404 Accepted: 2047 Desc ...
- 【C++/Qt】Qt中的parent形参
在 派生类的构造函数初始化列表中 调用 父类的带有参数的构造函数,是为了初始化从父类继承来的成员变量.因为这些变量无法直接初始化,只能采用这种方式初始化. 而在qt中,MainWindow中的某成员变 ...
- Python3基础 把一个列表中内容给另外一个列表,形成两个独立的列表
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- 阻抗计算公式、polar si9000(教程)
给初学者的一直有很多人问我阻抗怎么计算的. 人家问多了,我想给大家整理个材料,于己于人都是个方便.如果大家还有什么问题或者文档有什么错误,欢迎讨论与指教!在计算阻抗之前,我想很有必要理解这儿阻抗的意义 ...
- 深入浅出设计模式——工厂方法模式(Factory Method)
介绍在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计模式的创建型设计模式.它解决的仍然是软件设计中与创建对象有关的问题.它可以更好的处理客户的需求变化. 引入我 ...
- Oracle_双机备份
1.dataguard http://jingyan.baidu.com/article/f96699bb956ef2894e3c1b39.html http://blog.itpub.net/262 ...
- datatables设置解析
条信息" "sSearch":"搜索" 基本的命令 aaSorting:参数是个数组 [[],[]]单独定义每一列的排序方式 aaSortingFi ...
- StringBuffer delete
描述 java.lang.StringBuffer.delete() 方法将删除这个序列的一个子字符串中的字符. 子字符串的开始在指定的start和延伸处的字符索引end - 1或结束的序列,如果不存 ...
- Python 日期格式转换
经常需要爬取网站上的时间信息,不同的网站又有不同的日期显示方式.而我需要将日期格式转化为一种特定的格式,所以为了简便和学习,记录下各种不同的日期格式转换. 日期格式化符号: %y :两位数的年份表示( ...
- 【转】浅析python 中__name__ = '__main__' 的作用
原文链接:http://www.jb51.net/article/51892.htm 举例说明解释的非常清楚,应该是看到的类似博文里面最简单的一篇: 这篇文章主要介绍了python 中__name__ ...