冒泡排序中 如果一个数的后面的某个数和这个数不符合排序规则 那么这个数就会在未来的某次冒泡中与那个数进行交换
这里用到了 树状数组求逆序数的办法来做 需要注意的是2028并不可以改完数组大小后直接套1526代码 因为会超出int的范围
树状数组求逆序对的耗时要比归并排序长一些 不过简单..
之所以要记录下来这道题是因为在其中并没有说 每一个数都是独一无二的 那么当我们离散化的时候就需要做出一些小的调整
1526
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
int c[5050];
int n;
struct node
{
int id;
int val;
};
node a[5050];
int cmp1(node a,node b)
{
return a.val<b.val;
}
int cmp2(node a,node b)
{
return a.id<b.id;
}
void lsh(){
sort(a+1,a+1+n,cmp1);
a[0].val=0;
for(int i=1;i<=n;i++)
{
int j=i;
while(a[j].val==a[i].val&&j<=n)
{
j++;
}
for(int k=i;k<j;k++)
{
a[k].val=i;
}
i=j-1;
}
sort(a+1,a+1+n,cmp2);
}
int lowbit(int i)
{
return i&(-i);
}
void add(int x)
{
for(int i=x;i<=n;i+=lowbit(i))
{
c[i]+=1;
}
}
int sum(int x)
{
int s=0;
for(int i=x;i>=1;i-=lowbit(i))
{
s+=c[i];
}
return s;
}
int main(){
while(cin>>n)
{
for(int i=1;i<=n;i++)
{
a[i].id=i;
cin>>a[i].val;
}
lsh();
memset(c,0,sizeof(c));
int ans=0;
for(int i=n;i>=1;i--)
{
int z=sum(a[i].val-1);
ans+=z;
add(a[i].val);
}
if(ans>1000000)
printf("xiaohouTLE!\n");
else
{
printf("xiaohouV5!\n");
}
}
}
2028
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
long long c[500050];
long long n;
struct node
{
long long id;
long long val;
};
node a[500050];
long long cmp1(node a,node b)
{
return a.val<b.val;
}
long long cmp2(node a,node b)
{
return a.id<b.id;
}
void lsh(){
sort(a+1,a+1+n,cmp1);
a[0].val=0;
for(long long i=1;i<=n;i++)
{
long long j=i;
while(a[j].val==a[i].val&&j<=n)
{
j++;
}
for(long long k=i;k<j;k++)
{
a[k].val=i;
}
i=j-1;
}
sort(a+1,a+1+n,cmp2);
}
long long lowbit(long long i)
{
return i&(-i);
}
void add(long long x)
{
for(long long i=x;i<=n;i+=lowbit(i))
{
c[i]+=1;
}
}
long long sum(long long x)
{
long long s=0;
for(long long i=x;i>=1;i-=lowbit(i))
{
s+=c[i];
}
return s;
}
int main(){
while(cin>>n)
{
if(!n)
break;
for(long long i=1;i<=n;i++)
{
a[i].id=i;
cin>>a[i].val;
}
lsh();
memset(c,0,sizeof(c));
long long ans=0;
for(long long i=n;i>=1;i--)
{
long long z=sum(a[i].val-1);
ans+=z;
add(a[i].val);
}
cout<<ans<<endl;
}
}