HDU 2689 Sort it
求逆序数。分治写法。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<iostream> using namespace std; typedef long long LL; const double pi=acos(-1.0),eps=1e-8; void File() { freopen("D:\\in.txt","r",stdin); freopen("D:\\out.txt","w",stdout); } inline int read() { char c = getchar(); while(!isdigit(c)) c = getchar(); int x = 0; while(isdigit(c)) { x = x * 10 + c - '0'; c = getchar(); } return x; } int n,a[1010]; int get(int l,int r,vector<int> &b) { if(l==r) { b.push_back(a[l]); return 0; } int m=(l+r)/2; vector<int>L,R; int x1=get(l,m,L), x2=get(m+1,r,R); int x3=0,pl=0,pr=0; for(;;) { if(pl==L.size()&&pr==R.size()) break; if(pl<L.size()&&pr<R.size()) { if(L[pl]<R[pr]) b.push_back(L[pl++]); else b.push_back(R[pr++]), x3=x3+L.size()-pl; } else if(pl<L.size()&&pr==R.size()) b.push_back(L[pl++]); else if(pl==L.size()&&pr<R.size()) b.push_back(R[pr++]), x3=x3+L.size()-pl; } return x1+x2+x3; } int main() { while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); vector<int> f; printf("%d\n",get(1,n,f)); } return 0; }