P2299
逆序对,归并排序统计一下.
这题我是真的wa哭了..以前没写过归并排序.虽然知道思路..
这次就真的写尴尬了..
搞到最后专门去找别人代码看来开去都没发现自己哪写错了..
终于..最后发现了.....
于是我加上了&&pl<=mid 这个东西..为啥加上..就不解释了..很尴尬的问题
#include
<
iostream
>
// #include <fstream>
// #include <stdio.h>
using namespace std;
const int MAXN = 500001 ;
int n;
long num[MAXN];
long c[MAXN];
long long result = 0ll;
// ifstream fin("1.txt");
void sort( int l, int r)
{
if (l==r)
{
return;
}
int mid=(l+r)/2;
sort(l,mid);
sort(mid+1,r);
int t=l;
int pl=l,pr=mid+1;
while(t<=r)
{
if (pr>r||(num[pl]<=num[pr]&&pl<=mid)) {c[t++]=num[pl++];continue;}
if (pl>mid||(num[pr]<num[pl]&&pr<=r)) { if (pl<=mid) result+=mid-pl+1;c[t++]=num[pr++];continue;}
}
for (int i=l;i<=r;i++)
num[i]=c[i];
}
int main()
{
while(1)
{
cin>>n;
if (0==n) break;
for (int i=1;i<=n;i++)
cin>>num[i];
//result=0;
result=0ll;
sort(1,n);
cout<<result<<endl;
}
// system("pause");
return 0;
}
// #include <fstream>
// #include <stdio.h>
using namespace std;
const int MAXN = 500001 ;
int n;
long num[MAXN];
long c[MAXN];
long long result = 0ll;
// ifstream fin("1.txt");
void sort( int l, int r)
{
if (l==r)
{
return;
}
int mid=(l+r)/2;
sort(l,mid);
sort(mid+1,r);
int t=l;
int pl=l,pr=mid+1;
while(t<=r)
{
if (pr>r||(num[pl]<=num[pr]&&pl<=mid)) {c[t++]=num[pl++];continue;}
if (pl>mid||(num[pr]<num[pl]&&pr<=r)) { if (pl<=mid) result+=mid-pl+1;c[t++]=num[pr++];continue;}
}
for (int i=l;i<=r;i++)
num[i]=c[i];
}
int main()
{
while(1)
{
cin>>n;
if (0==n) break;
for (int i=1;i<=n;i++)
cin>>num[i];
//result=0;
result=0ll;
sort(1,n);
cout<<result<<endl;
}
// system("pause");
return 0;
}