【树状数组(逆序数)】hdu 1394 Minimum Inversion Number
2014-01-31 19:29
323 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1394
题意:求一个循环数组的最小逆序数
分析:公式:
a[i-1]从第1位挪到最后1位时:
a[i-1]-1:比a[i-1]小的数;n-a[i-1]:比a[i-1]大的数
题意:求一个循环数组的最小逆序数
分析:公式:
a[i-1]从第1位挪到最后1位时:
a[i-1]-1:比a[i-1]小的数;n-a[i-1]:比a[i-1]大的数
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int NM=5005; int a[NM],c[NM]; int lowbit(int x) { return x&(-x); } void add(int x) { while(x<NM) { c[x]++; x+=lowbit(x); } } int getsum(int x) { int ans=0; while(x>0) { ans+=c[x]; x-=lowbit(x); } return ans; } int main() { int n,i,t,mmin,res; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++){ scanf("%d",&t); a[i]=++t; } memset(c,0,sizeof(c)); res=0; for(i=1;i<=n;i++) { add(a[i]); res+=i-getsum(a[i]); } mmin=res; for(i=2;i<=n;i++) { res=res+n-2*a[i-1]+1; //公式 if(res<mmin) mmin=res; } printf("%d\n",mmin); } return 0; }
相关文章推荐
- 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(线段树求逆序数)
- hdu 1394 Minimum Inversion Number (树状数组求逆序数)
- hdu 1394 Minimum Inversion Number 用线段树求0到n-1的排列的逆序数
- 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(逆序数)
- hdu1394 Minimum Inversion Number 逆序数、最小逆序数
- HDU 1394 Minimum Inversion Number 【单节点+逆序数】
- hdu 1394 Minimum Inversion Number - 树状数组
- HDU-1394 Minimum Inversion Number (逆序数,线段树或树状数组)
- hdu 1394 Minimum Inversion Number(逆序数)