xdoj 1024 简单逆序对

来源:互联网 发布:淘宝网四海认证钓具 编辑:程序博客网 时间:2024/05/20 04:46

题目链接:

点击打开链接

大意是求一串由0-9组成的数字的逆序对个数,很多人用线段树之类的数据结构写,但是事实上呢,不用高级数据结构也是很容易就能完成的。大致思路是从后往前遍历数字串,对于每个位置都能得出当前位置小于0-9中的每个数字的后缀和,小于当前位置的数的后缀和即为这个数的逆序对个数,将每个位置的逆序对个数加起来即得结果。

AC代码如下:

#include#include#define N 1000050#define P 1000000007int 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;}

原创粉丝点击