求逆序对

  题目大意:给你一个序列,求逆序对个数。

  注释:n<=$10^5$。

    此题显然可以跑暴力。想枚举1到n,再求在i的后缀中有多少比i小的,统计答案即可。这显然是$n^2$的。这...显然过不去,我们思考如何优化?显然,这里的有些过程是重复的。我们将这个序列设为a序列,对于两个1到n中的整数i<j,在j后面的数我们进行了多次重复枚举,我们思考如何优化。容易想到用一个桶来记录。只需要记录对于每一个数来讲,我后面有多少个数是比我小的,只需要将桶中的数累加即可。但是,我们必须记录是这个数之后的桶的含义,也就是说这个数之前的桶我们不可以进行修改,所以我们必须逆向枚举,这时一种做法,但是我们这里讲另一种做法:正向枚举。我们只需要记录这个数之前的桶的状况即可,查询时,只需要记录当前桶的前缀和,但是,我们如何修改这个前缀和?如果用数组实现的话修改是O(n)的,所以这个时间复杂度还是$n^2$的。而这个过程我们可以用树状数组维护。树状数组是针对桶的,也就是说,我树状数组记录的也是区间和,只不过这个区间和是针对桶的。我们在修改的时候只需要对于前面的,所有能看见这个数的树状数组进行修改。每个树状数组的节点的视野就是它后面的数。在查询时,我们只需要查询在这个数视野之内的数。显然,我们对于视野的理解是贪心的,即,这个数只能看见比自己大的数的桶。

  最后,附上丑陋的代码......

 #include <iostream>
#include <cstdio>
#define N 100010
using namespace std;
typedef long long ll;
int n,a[N],sum[N];
ll ans;
inline void fix(int x)
{
while(x)sum[x]++,x-=x&(-x);
}
inline int getsum(int x)
{
int re=;
while(x<=)re+=sum[x],x+=x&(-x);
return re;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++)
{
ans+=getsum(a[i]+);
fix(a[i]);
}
printf("%lld",ans);
return ;
}

  真难理解啊,博主智商低啊!!

最新文章

  1. HiKariCP的数据源配置
  2. Leetcode: Design Phone Directory
  3. Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
  4. SQL四舍五入及两种舍入
  5. Delphi代码优化
  6. java区分大小写,使用TAB进行缩进,public类名只能有一个,而且文件名与类名保持一致.
  7. 【QT相关】QT+opencv环境配置
  8. nginx多域名配置
  9. Java :BufferedWriter类和BufferedReader类的构造方法、主要方法
  10. winform程序压缩文件上传,服务器端asp.net mvc进行接收解压
  11. android-effect
  12. HDU 4770 Lights Against Dudely(暴力+状压)
  13. 弃 Java 而使用 Kotlin 的你后悔了吗?| kotlin将会是最好的开发语言
  14. python基本数据类型之列表和元组
  15. CCPC-Wannafly Winter Camp Day3 Div1 - 排列
  16. dojo DataGrid实现表格数据编辑的解决方案
  17. Android Intent之Action应用
  18. 安装ORACLE_RAC遇到的问题与解决方法
  19. htonl()函数学习
  20. JS片段大总结

热门文章

  1. udp协议的数据接收与发送的代码
  2. MTBF
  3. 百度地图JavaScript API经纬度查询-MAP
  4. Javascript和JQuery中常用的随机数产生函数
  5. Flex动态获取方法报错
  6. CentOS中配置SoftWareRaid磁盘冗余阵列
  7. IOS开发之XCode学习013:步进器和分栏控件
  8. JustMock .NET单元测试利器(一)
  9. var dataObj=eval(&quot;(&quot;+data+&quot;)&quot;);//转换为json对象(解决在ajax返回json格式数据的时候明明正确的获取了返回值但是却就是进不去success方法的问题。格式错误)
  10. 异常-----freemarker.core.NonStringException