您的位置:首页 > 其它

hdu--4911--归并排序||树状数组

2014-08-26 16:34 183 查看
发现一个小小的 逆序数里真的藏了好多东西啊=-=

解决这题 你需要知道一点...

对于一串给定的数字 我随便写一串吧..

index: 0  1  2  3  4

value: 4  8  7  5  6 这时候 总的逆序对数是 3+2=5 假如我们只能进行相邻元素的交换 这最好情况是什么呢?

那肯定就是假如本来 arr[x]>arr[x+1] 那这样是形成一个逆序数的吧 我们将它进行交换 这样就少了一个逆序数对是吧...

但是 对于其它位置的元素是没有影响的对吧

所以 我们需要的最小次数呢 就是sum<即原数组的逆序数个数> 然后把它和k比较下大小就是了

看到了disucss里面的帖子 才第一次 知道 sort是不稳定的排序...这题里要用stable_sort。。没用树状数组去写-呆会写

每天mhxy 和lol 玩来玩去 超累啊=-=

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

typedef long long LL;
int n;
const int size = 100010;
struct data
{
int id;
int val;
}node[size];
int tree[size];
int arr[size];

bool cmp( const data p , const data q )
{
return p.val < q.val;
}

int lowbit( int x )
{
return x&-x;
}

void update( int x , int num )
{
while( x<=n )
{
tree[x] += num;
x += lowbit(x);
}
}

LL getSum( int x )
{
LL sum = 0;
while( x )
{
sum += tree[x];
x -= lowbit(x);
}
return sum;
}
int main()
{
cin.sync_with_stdio(false);
LL k , ans;
while( cin >> n >> k )
{
ans = 0;
memset( tree , 0 , sizeof(tree) );
for( int i = 1 ; i<=n ; i++ )
{
cin >> node[i].val;
node[i].id = i;
}
stable_sort( node+1 , node+n+1 , cmp );
for( int i = 1 ; i<=n ; i++ )
{
arr[ node[i].id ] = i;
}
for( int i = 1 ; i<=n ; i++ )
{
update( arr[i] , 1 );
ans += ( i - getSum(arr[i]) );
}
cout << max( ans-k , (LL)0 ) << endl;
}
return 0;
}


View Code

today:

  总要有荒唐的事 来完整你的人生

  多活十年又如何

  不过是八九十岁罢了

  不能多活二十岁这一年
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: