hdu1394 Minimum Inversion Number
2014-01-18 17:54
435 查看
求Inversion的最小逆序数
先用线段树求出初序列的逆序数,
然后 每次将最后一个数,移到第一个位置
逆序数的变化 减少a[i], 增加n - 1 - a[i]
记录最小逆序数
update:单点增减 query:区间求和
先用线段树求出初序列的逆序数,
然后 每次将最后一个数,移到第一个位置
逆序数的变化 减少a[i], 增加n - 1 - a[i]
记录最小逆序数
update:单点增减 query:区间求和
#include <cstdio> #include <cstring> using namespace std; #define LL(x) (x<<1) #define RR(x) (x<<1|1) const int maxn = 5005; struct node { int l, r; int sum; }tree[maxn*4]; int a[maxn]; void build(int rt, int l, int r) { tree[rt].l = l; tree[rt].r = r; tree[rt].sum = 0; if(tree[rt].l == tree[rt].r) { return ; } int mid = (tree[rt].l + tree[rt].r)>>1; build(LL(rt), l, mid); build(RR(rt), mid+1, r); } void update(int rt, int pos) { if(tree[rt].l == tree[rt].r) { tree[rt].sum += 1; return ; } int mid = (tree[rt].l + tree[rt].r)>>1; if(pos <=mid) update(LL(rt), pos); else update(RR(rt), pos); tree[rt].sum = tree[LL(rt)].sum + tree[RR(rt)].sum; } int query(int rt, int l, int r) { if(l <= tree[rt].l && tree[rt].r <= r) { return tree[rt].sum; } int mid = (tree[rt].l + tree[rt].r)>>1; int ret = 0; if(l <= mid) ret += query(LL(rt), l, r); if(r > mid) ret += query(RR(rt), l, r); return ret; } int main() { int n, i, ret, sum; while(scanf("%d",&n)!=EOF) { build(1, 0, n-1); sum = 0; for(i=0; i<n; ++i) { scanf("%d",&a[i]); sum += query(1, a[i], n-1); update(1,a[i]); } ret = sum; for(i=0; i<n-1; ++i) { ret += n- a[i] - a[i] - 1; if(sum > ret) sum = ret; } printf("%d\n", sum); } return 0; }
相关文章推荐
- hdu 1394 Minimum Inversion Number(线段树-单点更新)
- 【HDU】1394 Minimum Inversion Number
- HDU1394-Minimum Inversion Number-归并排序求最小逆序数
- 线段树求逆序数 hdu 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number(树状数组)
- HDU 1394 Minimum Inversion Number(单点更新 + 求逆序数)
- HDU 1394:Minimum Inversion Number(树状数组,线段树)[水]
- 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 || ZOJ Monthly, January 2003 || 线段树 + 逆序数
- hdu1394--Minimum Inversion Number(线段树求逆序数,纯为练习)
- HDU1394 Minimum Inversion Number(线段树单点更新)
- HDU 1394 Minimum Inversion Number【线段树求逆序数】
- HDU-1394 Minimum Inversion Number(线段树求逆序数)
- hdu1394-Minimum Inversion Number(线段树)
- HDU 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number