题目链接: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;}
有人要进来,有一些人不得不离开。