#include<stdio.h> #define MAXN 5005 int a[MAXN]; int main() { int n,i,j; while(~scanf("%d",&n)) { int ans=0x3f3f3f3f; for(i=0; i<n; i++) scanf("%d",&a[i]); int sum=0; for(i=0; i<n; i++) for(j=i+1; j<n; j++) if(a[i]>a[j]) sum++; if(ans>sum) ans=sum; for(i=0; i<n; i++) { sum=sum-a[i]+n-1-a[i]; if(ans>sum) ans=sum; } printf("%d\n",ans); } return 0; }
#include<cstdio> #include<iostream> #include<sstream> #include<cstdlib> #include<cstring> #include<string> #include<climits> #include<cmath> #include<algorithm> #include<queue> #include<vector> #include<stack> #include<set> #include<map> using namespace std; #define lson l, m , rt << 1 #define rson m+1, r, rt << 1 | 1 #define root 0,n-1,1 const int MX=5000+5; int S[MX<<2]; void push_up(int rt) { S[rt]=S[rt<<1]+S[rt<<1|1]; } void build(int l,int r,int rt) { S[rt]=0; if(l==r) return ; int m=(l+r)>>1; build(lson); build(rson); } void update(int x,int l,int r,int rt) { if(l==r) { S[rt]=1; return ; } int m=(l+r)>>1; if(x<=m) update(x,lson); else update(x,rson); push_up(rt); } int query(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R) return S[rt]; int m=(l+r)>>1,ret=0; if(L<=m) ret+=query(L,R,lson); if(R>m) ret+=query(L,R,rson); return ret; } int main() { int n,x[MX]; while(~scanf("%d",&n)) { build(root); int sum=0; for(int i=0; i<n; i++) { scanf("%d",&x[i]); sum+=query(x[i],n-1,root); update(x[i],root); } int cnt=sum; for(int i=0; i<n; i++) { sum=sum-x[i]+n-1-x[i]; if(sum<cnt) cnt=sum; } printf("%d\n",cnt); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 1394 Minimum Inversion Number(暴力/线段树)
原文地址:http://blog.csdn.net/qq_30076791/article/details/47355387