hdu 1394 Minimum Inversion Number(线段树+逆序对)
2013-08-02 22:31
316 查看
原题友情链接~快速通道~请轻戳~hdu 1394
这里说下题目的意思。
告诉你一个长度为n的序列,序列的元素为0~n-1,序列元素是无序的。
序列可以进行变换,就是可以把当前序列的第一个元素扔到序列末尾,形成一个新的序列。求所有中变换的序列中逆序对的最少情况。(逆序对 i < j && ai>aj)
思路:先求出一种情况序列的逆序对数,每进行一次变化逆序对数的变化只跟第一个元素的在有序序列中的相对大小有关。
知道这个后只要求出一个序列的逆序对数,在进行变化的过程中保存下最小的逆序对数即可~
具体实现看代码
这里说下题目的意思。
告诉你一个长度为n的序列,序列的元素为0~n-1,序列元素是无序的。
序列可以进行变换,就是可以把当前序列的第一个元素扔到序列末尾,形成一个新的序列。求所有中变换的序列中逆序对的最少情况。(逆序对 i < j && ai>aj)
思路:先求出一种情况序列的逆序对数,每进行一次变化逆序对数的变化只跟第一个元素的在有序序列中的相对大小有关。
知道这个后只要求出一个序列的逆序对数,在进行变化的过程中保存下最小的逆序对数即可~
具体实现看代码
#include<cstdio> #include<cstring> using namespace std; const int Maxsize = 5005; typedef struct { int l,r,value; }Tree; Tree tree[4*Maxsize]; void build(int v,int l,int r) { tree[v].l = l; tree[v].r = r; if(l == r) { tree[v].value = 0; return ; } int mid = (l + r)>>1; build(v<<1,l,mid); build(v<<1|1,mid+1,r); tree[v].value = 0; } void update(int v,int k) { tree[v].value++; if(tree[v].l == tree[v].r) { return; } int mid = (tree[v].l + tree[v].r)>>1; if(k <= mid) { update(v<<1,k); } else { update(v<<1|1,k); } } int query(int v,int l,int r) { if(tree[v].l == l && tree[v].r == r) { return tree[v].value; } int mid = (tree[v].l + tree[v].r)>>1; if(r <= mid) { return query(v<<1,l,r); } else { if(l>mid) { return query(v<<1|1,l,r); } else { return query(v<<1,l,mid) + query(v<<1|1,mid+1,r); } } } int main() { int n,sum; int a[Maxsize]; while(scanf("%d",&n) != EOF) { int sum = 0; build(1,0,n-1); for(int i = 0 ; i < n ; i++) { scanf("%d",&a[i]); sum += query(1,a[i],n-1);/*线段树求逆序对*/ update(1,a[i]); } int ans = sum; for(int i = 0 ; i < n - 1; i++)/*一次列举其他的所有情况*/ { sum = sum + n- 1 - a[i] - a[i]; if( sum < ans)/*所有排列中的最小逆序对数*/ { ans = sum; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- hdu 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number 线段树 逆序数
- hdu 1394/哈理工oj 1250 Minimum Inversion Number【线段树过】
- Minimum Inversion Number(hdu1394(线段数or暴力))
- HDU1394 Minimum Inversion Number(线段树)
- hdu 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number(树状数组)
- hdu 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number(线段树之 单点更新求逆序数)
- HDU 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number(树状数组||线段树)
- Minimum Inversion Number hdu 1394
- HDU 1394 Minimum Inversion Number
- HDU-1394 Minimum Inversion Number 线段树|树状数组
- hdu 1394 Minimum Inversion Number (树状数组 )
- hdu 1394 Minimum Inversion Number
- 【树状数组(逆序数)】hdu 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number 线段树
- hdu 1394 Minimum Inversion Number 线段树求最小逆序数