我是靠谱客的博主 欢喜苗条,最近开发中收集的这篇文章主要介绍树状数组板子题之一:poj 2299:Ultra-QuickSort(求逆序对)
树状数组板子题之一:poj 2299:Ultra-QuickSort(求逆序对)
,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
树状数组板子题之一:poj 2299:Ultra-QuickSort(求逆序对)
题目链接:poj 2299:Ultra-QuickSort
其实看似是问快排的交换总次数
其实就是问逆序对的总数
开始实现不知道怎么搞,看了题解之后原来是要用到离散化,感觉有点神奇
代码入下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
/**主要用于离散化*/
struct Node
{
int val;
int pos;
}node[500010];
int c[500010];
int n;
inline int lowbit(int x)
{
return x&(-x);
}
int cmp(Node x,Node y)
{
if(x.val!=y.val)
return x.val<y.val;
else
return x.pos<y.pos;
}
/**由于求逆序对的的特殊性,只需要加一,于是就只要一个参数即可*/
void add(int x)
{
for(int i=x;i<=n;i+=lowbit(i))
{
c[i]++;
}
}
ll sum(int x)
{
ll s=0;
for(int i=x;i;i-=lowbit(i))
{
s+=c[i];
}
return s;
}
int main()
{
while(~scanf("%d",&n))
{
if(n==0)
break;
memset(node,0,sizeof(node));
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
scanf("%d",&node[i].val);
node[i].pos=i;
}
sort(node+1,node+n+1,cmp);
ll cnt=0;
for(int i=1;i<=n;i++)
{
add(node[i].pos);
cnt+=i-sum(node[i].pos);
}
printf("%lldn",cnt);
}
return 0;
}
最后
以上就是欢喜苗条为你收集整理的树状数组板子题之一:poj 2299:Ultra-QuickSort(求逆序对) 树状数组板子题之一:poj 2299:Ultra-QuickSort(求逆序对) 的全部内容,希望文章能够帮你解决树状数组板子题之一:poj 2299:Ultra-QuickSort(求逆序对) 树状数组板子题之一:poj 2299:Ultra-QuickSort(求逆序对) 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复