poj2299 树状数组入门题

原创 2012年03月22日 09:15:13
/*
  这里关键就是如何用通过一系列求和操作求出逆序对数
  假设我们对于任何一个序列 a1,a2,a3,a4,a5....an
  那么 我们首先对于每一个数 依次进行一次 update(ai,1)  (i=1....n)
  这里实质上就是 在树状数组中把大于等于ai的 数以此更新加1
  然后getsum(ai) 这其实求的就是在树状数组中1...ai ,
  1.如果在前面的过程中没有比ai小的数,那么此时用i-getsun(ai) 求出的
  就是到目前为止有多少前面有多少比他大的数 ,
  2.如果在前面有比ai小的数,因为update(ai,1)已经包括进去,然后用i-getsum(ai)就是对的,
 
  这里要用位的思维方式来理解  时间复杂度也是nlogn
  更详细的见这里
  http://blog.csdn.net/jiejiuzhang1579/article/details/6877725
*/
#include<iostream>
#include<algorithm>
#include<iterator>
#define maxn 500006
using namespace std;
int tree[maxn];
struct node
{
 int val;
 int no;
};
node num[maxn];
bool cmp(node a,node b)
{
     return a.val<b.val;
}
int lowbit(int x)
{
    return x&(-x);
}
void update(int node,int val)
{
    while(node<maxn)
    {
      tree[node]+=val;
      node+=lowbit(node);
    }
}
int getsum(int node)
{
    int sum=0;
    while(node>0)
    {
      sum+=tree[node];
      node-=lowbit(node);
    }
    return sum;
}
int main()
{
    int n;
    long long sum;
    int aa[maxn];
    while(cin>>n&&n!=0)
    {
      for(int i=1;i<=n;i++)
       {
         cin>>num[i].val;
         num[i].no=i;
       }
      sort(num+1,num+n+1,cmp);
      memset(tree,0,sizeof(tree));
      for(int i=1;i<=n;i++)
       {
         aa[num[i].no]=i;
       }
      sum=0;
      for(int i=1;i<=n;i++)
      {
        update(aa[i],1);
        sum+=(i-getsum(aa[i]));
      }
      cout<<sum<<endl;
    }
    system("pause");
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

树状数组专题入门——POJ 2352,1556,2155,3321,1990,2309,1195,2481,2299,3067

树状数组专题入门——POJ 2352,1556,2155,3321,1990,2309,1195,2481,2299,3067...

poj 2299 Ultra-QuickSort(树状数组+离散化的题目)据说是简单题,不过还是觉得好难。。。

1、http://poj.org/problem?id=2299 2、题目大意: 一个序列有n个数字,他们是无序的,现在要将这些数字交换顺序,使得他们是从小到大排列的,输出最少交换几次,3、思路分析 ...

poj-2299-Ultra-QuickSort-归并排序求逆序数--或树状数组

Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce...

树状数组+离散化求逆序数poj2299Ultra-QuickSort

Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proc...

POJ 2299 Ultra-QuickSort 求逆序对数(归并排序,树状数组)

Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 36281 ...

树状数组例题(poj2299)

传送门: 树状数组,具体的说是 离散化+树状数组。这也是学习树状数组的第一题. 算法的大体流程就是: 1.先对输入的数组离散化,使得各个元素比较接近,而不是离散的, 2.接着,运用树状数组的标准操作来...

POJ 2299 Ultra-QuickSort 【归并排序求逆序数 OR 树状数组求逆序数】

PKU2299 Ultra-QuickSort 【归并排序求逆序数 OR 树状数组求逆序数】

POJ 2299 树状数组求逆序对

题意 给定一组序列可转换相邻项的序列, 求让它排成非递减的最小操作数 题解 就是求序列逆序对数, 但是序列最大数据较大, 数组开不出来, 所以需要现进行离散化 比如 9, 1, 0, 5...
  • ADjky
  • ADjky
  • 2016年11月18日 15:42
  • 170

poj 2299 Ultra-QuickSort 树状数组求解逆序数

Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proc...
  • DGY01
  • DGY01
  • 2016年08月24日 12:24
  • 122

POJ2299 Ultra-QuickSort(逆序数问题,树状数组求解)

Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 47676 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj2299 树状数组入门题
举报原因:
原因补充:

(最多只允许输入30个字)