Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 49132 | Accepted: 17969 |
Description
Input
Output
Sample Input
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0
Source
//超时。。。 #include <iostream> #include <cstring> #include <cstdio> using namespace std; const long long N=510000; long long n,a[N],t[N],ans,r,i,j,k,now; void Sort(long long l,long long r) { if(l==r) return; long long mid=(l+r)/2; Sort(l,mid); Sort(mid+1,r); i=1; j=mid+1; now=0; while(i<=mid&&j<=r) { if(a[i]>a[j]) { ans+=mid-i+1; t[++now]=a[j++]; } else t[++now]=a[i++]; } while(i<=mid) t[++now]=a[i++]; while(j<=r) t[++now]=a[j++]; now=0; for(k=1; k<=r; ++k) a[k]=t[++now]; } int main() { std::ios::sync_with_stdio(false); cin>>n; while(n) { for(i=1; i<=n; ++i) cin>>a[i]; ans=0; Sort(0,n); cout<<ans<<endl; cin>>n; } return 0; }
#include <iostream> #include <algorithm> using namespace std; long long a[500010],t[500010],ans; void Sort(long long l,long long r) { if(r-l>1) { long long m=l+(r-l)/2; //取中间点 long long p=l,q=m,i=l; Sort(l,m); Sort(m,r); //左右子区间递归求解 while(p<m || q<r) //若合并未完成继续循环 { if(q>=r || (p<m && a[p]<=a[q]) ) t[i++]=a[p++]; //合并a[p]到t[i]中 else { t[i++]=a[q++]; //合并a[q]到t[i]中 ans+=m-p; //a[p]到中间点都与a[q]形成逆序对 } } for(i=l; i<r; ++i)a[i]=t[i]; //把合并区间t再赋值回给a; } } int main() { long long N; cin>>N; while(N) { for(long long i=0; i<N; ++i) cin>>a[i]; ans=0; Sort(0,N); cout<<ans<<endl; cin>>N; } return 0; }