#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <set>
#include <stack>
#include <queue>
using namespace std;
const int maxn=10010;
int sum;
int f[maxn*4];
void Build(int n)
{
sum=0;
n=n<<2;
for(int i=0;i<=n;i++)
f[i]=0;
}
void update(int t,int l,int r,int k)
{
f[t]++;
if(l==r-1)
return;
int mid=(l+r)/2;
if(mid<k)
{
sum+=f[t<<1];
update(t<<1|1,mid,r,k);
}
else
{
update(t<<1,l,mid,k);
}
}
int main()
{
//freopen("data","r",stdin);
int n,m;
scanf("%d%d",&n,&m);
int ans=0,pre=n*n,a;
for(int i=1;i<=m;i++)
{
Build(n);
for(int j=0;j<n;j++)
{
scanf("%d",&a);
update(1,0,n,a);
}
if(pre>sum)
{
pre=sum;
ans=i;
}
}
printf("%d\n",ans);
return 0;
}
给出k个序列,求那个序列的逆序对最多。
用线段树求逆序对,树状数组也可以。