我是靠谱客的博主 欢喜苗条,最近开发中收集的这篇文章主要介绍树状数组板子题之一: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(求逆序对) 所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部