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 玩来玩去 超累啊=-=
View Code
today:
总要有荒唐的事 来完整你的人生
多活十年又如何
不过是八九十岁罢了
不能多活二十岁这一年
解决这题 你需要知道一点...
对于一串给定的数字 我随便写一串吧..
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:
总要有荒唐的事 来完整你的人生
多活十年又如何
不过是八九十岁罢了
不能多活二十岁这一年
相关文章推荐
- HDU 4911 归并排序题目解析
- HDU ~ 1394 ~ Minimum Inversion Number(暴力||归并排序||线段树||树状数组)
- 归并排序求逆序数——HDU 4911
- ACM 逆序对 hdu 4911 Inversion 离散化 树状数组模板
- hdu 4911 Inversion(归并)
- 归并排序题目整理归并(hdu)
- hdu 1394 求循环串的最小逆序数 暴力法 线段树 归并排序3种方法
- HDU 5032 Always Cook Mushroom (极角排序 x 树状数组)
- HDU_4911_Inversion_归并统计逆序对_杭电多校A题
- hdu 4911 求逆序对数+树状数组
- hdu - 4911 - Inversion(离散化+树状数组)
- hdu 5032 树状数组+极角排序
- HDU 4911 Inversion(归并求逆序对)
- HDU 5032 Always Cook Mushroom(极角排序, 树状数组)
- HDU 3743 Frosh Week 【归并排序模板题】
- hdu 1541 Stars(排序+树状数组)
- HDU 4911 Inversion(基本算法-排序,基本算法-分治)
- hdu 4911 归并 求逆序对对数(Java实现)
- 2014多校第五场1001 || HDU 4911 Inversion (归并求逆序数)
- HDU 4911 Inversion(基本算法-排序,基本算法-分治)