题目链接:
大意是求一串由0-9组成的数字的逆序对个数,很多人用线段树之类的数据结构写,但是事实上呢,不用高级数据结构也是很容易就能完成的。大致思路是从后往前遍历数字串,对于每个位置都能得出当前位置小于0-9中的每个数字的后缀和,小于当前位置的数的后缀和即为这个数的逆序对个数,将每个位置的逆序对个数加起来即得结果。
AC代码如下:
#include
#include
#define N 1000050
#define P 1000000007
int a[N],n,num[N][10];
long long ans=0;
int main(){
int t;
scanf("%d",&t);
while(t--){
ans=0;
memset(num,0,sizeof(num));
scanf("%d",&n);
for(int i=0;i
=0;i--){//从后往前遍历
for(int j=0;j<10;j++){//得到每个位置的0-9的小于该数的个数的后缀和,如1存的是0的个数,2存的是0和1的个数......以此类推
if(a[i]>j){
num[i][j]=num[i+1][j];
}
else{
num[i][j]=num[i+1][j]+1;
}
}
ans=ans+(a[i]>0?num[i][a[i]-1]:0);//当前数的逆序对个数
}
printf("%lld\n",ans%P);
}
return 0;
}