上课讲了下数据结构,因为暂时没找到分块的板子题,所以做一下这道题加深一下对树状数组的理解。

  题意就是求逆序对,从逆序对的定义就可以看出,方法有两种:归并 or 树状数组。

  感觉树状数组更高级一点,写起来也比较容易(其实是不会归并)

  在这里由于a[i]太大(0~999999999),因此离散化一下,也就是开个结构体排序后看一下它在第几个。

  一个数产生的逆序对数就是它前面的比它大的个数。

  因此对于x,先查询sum(x+1,n)的值,再add(x)即可。

  CODE

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const LL N=;
struct data
{
LL x,num;
}a[N];
LL p[N],c[N],i,n,ans;
inline void read(LL &x)
{
x=; char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
}
inline void write(LL x)
{
if (x/) write(x/);
putchar(x%+'');
}
inline LL comp(data a,data b)
{
return a.x<b.x;
}
inline LL lowbit(LL x)
{
return x&(-x);
}
inline LL get(LL x)
{
LL res=;
while (x)
{
res+=c[x];
x-=lowbit(x);
}
return res;
}
inline void add(LL x)
{
while (x<=n)
{
c[x]+=;
x+=lowbit(x);
}
}
int main()
{
for (;;)
{
memset(c,,sizeof(c));
read(n); ans=;
if (!n) break;
for (i=;i<=n;++i)
read(a[i].x),a[i].num=i;
sort(a+,a+n+,comp);
for (i=;i<=n;++i)
p[a[i].num]=i;
for (i=;i<=n;++i)
ans+=get(n)-get(p[i]),add(p[i]);
write(ans); putchar('\n');
}
return ;
}

最新文章

  1. 一键启动NameNode和DataNode--shell脚本
  2. HttpGet
  3. 移动端web之像素基础
  4. App Icon生成工具(转载)
  5. JVM GC之一找出不可达对象并回收
  6. 十九、Android Activity初探
  7. git忽略特殊文件
  8. Java实现GB2312文件转UTF8文件
  9. 送你一双看见时间的眼睛--时间master软件
  10. LeetCode--689_Maximum_Sum_of_3_NonOverlapping_Subarrays
  11. 在SOUI中使用窗口自適應大小
  12. java 重载、重写、重构的区别
  13. Ajax 及里面的XStream《黑马程序员_超全面的JavaWeb视频教程vedio》
  14. 如何在eclipse安装apk包
  15. SpringBoot中常见注解含义总结
  16. 实体转xml 并以string输出
  17. java 分布式与集群的区别和联系(转)
  18. Spring笔记 #01# 一个小而生动的IOC例子代码
  19. Qt 编程指南10 QImage Mat QPixmap转换
  20. [转]QDir类及其用法总结

热门文章

  1. 类与接口(三)java中的接口与嵌套接口
  2. 机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集
  3. go语言练习:指针
  4. Ubuntu 18.04 Server 设置静态IP
  5. Oracle EBS OPM release step
  6. centos 7 linux x64
  7. ConcurrentModificationException探究
  8. sdn2017 第三次作业
  9. Django商城项目笔记No.18商品部分-数据表创建
  10. 分享-结合demo讲解JS引擎工作原理