通过这道题我大体理解了树状数组的原理和用法,完全用的别人的算法,我把别人算法看懂之后有自己敲了一遍,不得不说这算法真是高深巧妙啊,我开始看都看不懂,还是在别人的讲解下才看懂的,我觉得有必要写个博客记录一下。

算法先将所有数字离散化,按原来的大小关系从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的更多相关文章

  1. 三部曲一(数据结构)-1024-Eqs

    解方程整数解的题,通过这道题我学会了这种题的一般做法,对于未知数较少.取值范围较小且解为整数的方程,把一半的未知数移到等式的另一边,然后对两边分别枚举,用哈希配对,如果有相同的结果就找到一组解.具体做 ...

  2. 三部曲一(数据结构)-1022-Gold Balanced Lineup

    Gold Balanced Lineup Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Othe ...

  3. 三部曲一(数据结构)-1011-Sorting It All Out

    每次加入一个关系都要进行拓扑排序,不过在排序过程中需要判断是否出现多个入度为0的点,如果出现了就说明不能确定大小关系.不论出不出现多个入度为0的点拓扑排序都要进行到最后来判断是否出现环,因为一旦出现环 ...

  4. Big O Complexity Graph

    Big O Complexity Graph Big O === O() 算法复杂度速查表 数据结构 数组排序算法 Quicksort O(n log(n)) O(n log(n)) O(n^2) O ...

  5. C#数据结构与算法系列(二十二):快速排序算法(QuickSort)

    1.介绍 快速排序(QuickSort)是对冒泡排序的一种改进,基本思想是:通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数 ...

  6. 数据结构与算法 Big O 备忘录与现实

    不论今天的计算机技术变化,新技术的出现,所有都是来自数据结构与算法基础.我们需要温故而知新.        算法.架构.策略.机器学习之间的关系.在过往和技术人员交流时,很多人对算法和架构之间的关系感 ...

  7. 数据结构(DataStructure)与算法(Algorithm)、STL应用

    catalogue . 引论 . 数据结构的概念 . 逻辑结构实例 2.1 堆栈 2.2 队列 2.3 树形结构 二叉树 . 物理结构实例 3.1 链表 单向线性链表 单向循环链表 双向线性链表 双向 ...

  8. WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...

  9. 翻阅《数据结构与算法javascript描述》--数组篇

    导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...

随机推荐

  1. YTU 2345: 后序遍历二叉树

    原文链接:https://www.dreamwings.cn/ytu2345/2611.html 2345: 后序遍历二叉树 时间限制: 1 Sec  内存限制: 128 MB 提交: 3  解决:  ...

  2. springmvc web-info目录下无法引入的js文件无效

    今天在联系spring的时候而然遇到了个不起眼的问题.那就是在html或者说jsp页面中引用js文件的时候总是提示找不到路径.eclipse更是抛出 No mapping to aa.js. 我就奇怪 ...

  3. noi 9267 核电站

    题目链接:http://noi.openjudge.cn/ch0206/9267/ 描述 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可 ...

  4. MySql + EF6 + .Net Core

    2016年8月17日01:21:29 更新:这里介绍一下一个开源的 EF Core 的 MySQL 组件 [MySQL for .NET Core - Pomelo 扩展包系列][http://www ...

  5. iOS 枚举的巧用

    前言 在之前的一篇文章中简单的提到了这个问题, 但是自己写的不详细, 并且自己深入了解的也不是特别多, 在开发中也没怎么用到,所以经过阅读者的反馈对这个问题很是疑惑! 本篇文章会分析之前的不足之处, ...

  6. bat 命令分行写

    myprog parameter parameter parameter parameter parameter parameter parameter parameter parameter par ...

  7. signtool

    https://msdn.microsoft.com/en-us/library/8s9b9yaz(v=vs.110).aspx C:\Users\Administrator\.nuget\packa ...

  8. Monkey 使用aapt查看apk包名

    使用aapt    //aapt是sdk自带的一个工具,在sdk\builds-tools\目录下1.以ES文件浏览器为例,命令行中切换到aapt.exe目录执行:aapt dump badging ...

  9. json 后台传前台

    jsonObject需实例化new.jsonObject=new JSONObject();jsonObject.put("goodslist", list);jsonObject ...

  10. [hadoop] 一些基础概念

    一.云的概念 1.云计算的概念 随时 随地 使用任何设备 获得任何服务 2.趋势 )资料开始回归集中处理(存储大量资料) 随时存取 降低遗失风险 减少传输成本 促进团队协作 )网页变为预设开发平台(网 ...