Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 15113 Accepted Submission(s): 9230
#include <cstdio> #include <iostream> #include <cstdlib> #include <algorithm> #include <ctime> #include <cmath> #include <string> #include <cstring> #include <stack> #include <queue> #include <list> #include <vector> #include <map> #include <set> using namespace std; const int INF=0x3f3f3f3f; const double eps=1e-10; const double PI=acos(-1.0); #define maxn 5500 int tre[4*maxn]; void update(int num, int le, int ri, int x) { if(le == ri) { tre[num] = 1; return; } int mid = (le+ri)/2; if(x<=mid) update(num*2,le,mid,x); else update(num*2+1,mid+1,ri,x); tre[num] = tre[num*2] + tre[num*2+1]; } int query(int num, int le, int ri, int x, int y) { if(x<=le&&y>=ri) { return tre[num]; } int mid = (le+ri)/2; int ans = 0; if(x<=mid) ans += query(num*2,le,mid,x,y); if(y>mid) ans += query(num*2+1,mid+1,ri,x,y); return ans; } int a[maxn]; int main() { int n; while(~scanf("%d", &n)) { memset(tre, 0, sizeof tre); int sum = 0; for(int i = 0; i < n; i++) { scanf("%d", &a[i]); update(1,0,n-1,a[i]); sum += query(1,0,n-1,a[i]+1,n-1); } int ans = sum; for(int i = 0; i < n; i++) { sum = sum - a[i] + (n-1-a[i]); ans = min(ans, sum); } printf("%d\n", ans); } return 0; }
#include <cstdio> #include <iostream> #include <cstdlib> #include <algorithm> #include <ctime> #include <cmath> #include <string> #include <cstring> #include <stack> #include <queue> #include <list> #include <vector> #include <map> #include <set> using namespace std; const int INF=0x3f3f3f3f; const double eps=1e-10; const double PI=acos(-1.0); #define maxn 5500 int cnt; int t[maxn],a[maxn],b[maxn]; void merge_sort(int x,int y)//归并排序模板 { if(y-x>1) { int m=x+(y-x)/2; int p=x,q=m,i=x; merge_sort(x,m); merge_sort(m,y); while(p<m||q<y) { if(q>=y||(p<m&&a[p]<=a[q])) t[i++]=a[p++]; else { t[i++]=a[q++]; cnt+=m-p; } } for(i=x;i<y;i++) a[i]=t[i]; } } int main() { int n; while(~scanf("%d", &n)) { for(int i = 0; i < n; i++) { scanf("%d", &a[i]); b[i] = a[i]; } cnt = 0; merge_sort(0,n); int ans = cnt; for(int i = 0; i < n; i++) { cnt = cnt - b[i] + (n-1-b[i]); ans = min(ans, cnt); } printf("%d\n", ans); } return 0; }
HDU1394 Minimum Inversion Number(线段树OR归并排序)
原文:http://www.cnblogs.com/ZP-Better/p/4855771.html