(2012-07-20 20:04:48)
SOJ2309:http://cstest.scu.edu.cn/soj/problem.action?id=2309
这是我过的第一道树状数组的题,而且是用来解逆序数的。
关于树状数组和数组的离散化问题,请见:http://blog.csdn.net/q573290534/article/details/6664902。个人觉得这篇博文写得很好。
SOJ2309:http://cstest.scu.edu.cn/soj/problem.action?id=2309
这是我过的第一道树状数组的题,而且是用来解逆序数的。
关于树状数组和数组的离散化问题,请见:http://blog.csdn.net/q573290534/article/details/6664902。个人觉得这篇博文写得很好。
其实算法所用的还是树状数组的三个经典函数,只不过稍微改动。
#include<iostream>
#include<cstring>
using namespace std;
int a[21][10005];
int c[10005];
int lowbit(int x)
{
return x&(x^(x-1));
}
int sum(int k)
{
int result=0;
while(k)
{
result=result+c[k];
k=k-lowbit(k);
}
return result;
}
void mod(int n,int i)
{
while(i<=n)
{
c[i]++;
i=i+lowbit(i);
}
}
int main()
{
int N,K;
int i,j;
int index;
while(scanf("%d%d",&N,&K)==2)
{
int max=-1;
for(i=1;i<=K;i++)
{
memset(c,0,sizeof(c));
int result=0;
for(j=1;j<=N;j++)
{
scanf("%d",&a[i][j]);
mod(N,a[i][j]);
result=result+j-sum(a[i][j]);
}
if(result>max)
{
max=result;
index=i;
}
}
printf("%d\n",index);
}
return 0;
}