UVALive 6508(树状数组求逆序数)

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4519

题意:

给出两个序列把他们数字相同连线,求交点的个数

PS:(转)

将第一串数字编号,,第二串按照编号译码,答案就是第二串译码后的逆序数

1 5 3 4 2 7 6

7 1 5 3 4 2 6

编号:

(1 5 3 4 2 7 6)一一对应(1 2 3 4 5 6 7)

(7 1 5 3 4 2 6)得到(6 1 2 3 4 5 7)

(6 1 2 3 4 5 7) 的逆序数为5

画个图看下比较清晰些。

代码如下:

#include <stdio.h>#include <string.h>int a[100017], x[100017];int n, c[100003];int Lowbit(int x) //2^k{return x&(-x);}void update(int i, int x)//i点增量为x{while(i <= n){c[i] += x;i += Lowbit(i);}}int sum(int x)//区间求和 [1,x]{int sum=0;while(x>0){sum+=c[x];x-=Lowbit(x);}return sum;}int main(){int t;scanf("%d",&t);while(t–){memset(c,0,sizeof c);scanf("%d",&n);for(int i = 1; i <= n; i++){scanf("%d",&a[i]);}for(int i = 1; i <= n; i++){x[a[i]] = i;}int ans = 0;for(int i = 1; i <= n; i++){scanf("%d",&a[i]);a[i] = x[a[i]];update(a[i],1);ans+=i-sum(a[i]);}printf("%d\n",ans);}return 0;}

有人要进来,有一些人不得不离开。

UVALive 6508(树状数组求逆序数)

相关文章:

你感兴趣的文章:

标签云: