【问题描述】

给你n个整数,每个数a[i]都是不超过109的非负整数。求其中逆序对的个数,即所有这样的数对(i,j)满足1≤i<j≤n且a[i]>a[j]。

【输入文件】inverse.in

第一行一个正整数n(1≤n≤500000),代表数字的个数。

接下来一行n个用空格分隔的整数,代表要处理的数字序列。

【输出文件】inverse.out

一行一个整数,代表逆序对的个数。

【样例输入】

5

2 3 1 5 4

【样例输出】

3

【数据及时间与空间限制】

对于20%的数据,n≤20000,对于100%的数据,n≤500000。

时间限制:1秒,空间限制:256MB。

【算法分析】

1.离散化 由于输入数据较为离散,我们对其采用保持大小关系但改变数值的办法,如以9 1 0 5 4为例,离散化后变成5 2 1 4 3,去除冗余内存空间和计算,有助于树状数组的高效运算。

2.树状数组 对于当前操作数a[i],计算getsum(m)-getsum(a[i]) {m为数列中数字个数} 并用add(a[i])将a[i]加入树状数组。

注:add过程实际为birtree中的change过程,由于本题的特殊性,每次调整数组只需+1,因此调整为add函数,只需一个参数。

【程序描述】

a数组 原始数列

b数组 快速排序后数列,用于离散化。

c数组 树状数组

lowbit函数、add函数、getsum函数 参考Birtree

【反思】

表示我读代码的水平越来越次了,然后快排居然忘记怎么写了跳进死循环了TAT,真心对不起老师啊。

【源程序】

Inverse

program inverse;
var a,b,c:array[0..500000] of longint;n,i:longint;
procedure qsort(l,r:longint);
var i,j,mid,temp:longint;
begini:=l;j:=r;mid:=a[(l+r) div 2];while i<=j dobeginwhile a[i]<=mid do inc(i);while a[j]>=mid do dec(j);if i<=j thenbegintemp:=a[i];a[i]:=a[j];a[j]:=temp;temp:=b[i];b[i]:=b[j];b[j]:=temp;inc(i);dec(j);end;end;if i<r then qsort(i,r);if j>l then qsort(l,j);
end;
function lowbit(i:longint):longint;
beginlowbit:=i-(i and (i-1));
end;
procedure add(i:longint);
beginwhile i<=n dobeginc[i]:=c[i]+1;i:=i+lowbit(i);end;
end;
function getsum(i:longint):longint;
begingetsum:=0;while i>0 dobegingetsum:=getsum+c[i];i:=i-lowbit[i];end;
end;
begin {main}readln(n);for i:=1 to n dobeginread(a[i]);b[i]:=i;end;qsort(1,n);c:=a; c[0]:=-1;for i:=1 to n doif c[i]<>c[i-1] thenbegininc(m);a[b[i]]:=m;endelsea[b[i]]:=m;fillchar(c,sizeof(c),0);for i:=1 to n dobegininc(ans,getsum(m)-getsum(a[i]);add(a[i]);end;writeln(ans);
end.

转载于:https://www.cnblogs.com/Sky-Grey/archive/2013/03/03/2941521.html

[树状数组] Inverse相关推荐

  1. 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)

    链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...

  2. 牛客 - tokitsukaze and Inverse Number(树状数组+逆序对定理)

    题目链接:点击查看 题目大意:给出一个长度为 n 的排列 a,需要执行 q 次操作,每次操作会将区间 [ l , r ] 内的数循环右移 k 次,现在需要回答每次操作后排列的逆序对数,只需要回答奇偶即 ...

  3. 洛谷 P5057 [CQOI2006]简单题(树状数组)

    嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...

  4. Color the ball(HDU1556)树状数组

    每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数. 树状数组,上下区间更新都可以,差别不大. 1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计 #include<b ...

  5. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  6. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)

    题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...

  7. poj_3067 树状数组

    题目大意 左右两个竖排,左边竖排有N个点,从上到下依次标记为1,2,...N; 右边竖排有M个点,从上到下依次标记为1,2....M.现在从K条直线分别连接左边一个点和右边一个点,求这K条直线的交点个 ...

  8. hdu 1166 敌兵布阵(树状数组)

    题意:区间和 思路:树状数组 #include<iostream> #include<stdio.h> #include<string.h> using names ...

  9. Equalizing Two Strings 冒泡排序or树状数组

    首先考虑排序后相等 如果排序后相等的话就只考虑reverse长度为2的,所以a或者b排序后存在相邻两个字母相等的话就puts YES,n>26也直接puts YES 不然的话就假设c为a,b排完 ...

最新文章

  1. 单片机c语言NTC温度查表程序,STM32查表法读NTC值并显示温度
  2. 《预训练周刊》第13期:CPM-2:大规模经济高效的预训练语言模型、变换器作为编程语言...
  3. AutoX“真无人”车队驶上繁忙街头,中国正式进无人驾驶时代
  4. 在java项目中加载IEDriverServer.exe引用路径
  5. javascript数据类型一览
  6. 【git学习二】git基础之git管理本地项目
  7. android activityManager
  8. asterisk的NAT配置
  9. 猎豹浏览器缓存文件在哪 猎豹浏览器缓存文件位置说明
  10. 笨方法“学习python笔记之random
  11. python培训价目表-python培训班费用在多少?
  12. 在NHibernate的单表继承模式下通过父类Repository查询子类
  13. spring aop示例_具有AOP事务管理的Spring ORM示例
  14. 大数据分析需要什么技术架构
  15. JQuery datepicker
  16. 我将出席 .NET Day in China 的圆桌讨论:探讨开发者就业话题
  17. DruidDataSource配置说明
  18. 快速传输大文件,怎么通过网络传大文件给对方(1G以上)
  19. 从P1到P7——我在淘宝这7年转载
  20. Greenplum Python专用库gppylib学习——GpArray

热门文章

  1. php配置文件修改数据库上传,请问php.ini上传文件大小限制配置修改路径在哪里?是在数据库哪里吗?表头是?...
  2. Python OpenCV 图片拆分与拼接
  3. cobaltstrike扩展_Cobalt Strike系列教程第七章:提权与横向移动
  4. java服务器http post_使用Java程序通过http post访问ABAP Netweaver服务器
  5. Effective C++ --3 资源管理
  6. 彩色图批量转换成灰度图、批量格式转换、批量重命名
  7. 【数学和算法】初识卡尔曼滤波器(四)
  8. 【Linux】22.当前运行的docker修改环境后,想在本地保存为镜像的方法
  9. Java NIO之套接字通道
  10. Spring事务传播行为详解