187A Permutations

这道题和“扑克牌排序”很相似,但是并不是排成升序,可以用同一种方式对两个序列排序,使第二个为升序,此时第一个序列就成了“扑克牌排序”的情况,只需要统计出第一次逆序出现的位置即可,由于是排列,可以用 O(n) 的方法来做;

# include <cstdio>

# define N 200010

int n, a[N], b[N];
int p[N];

void init(void)
{
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d", &b[i]);
        p[b[i]] = i;
    }
}

void solve(void)
{
    int i;

    for (i = 1; i < n; ++i)
    {
        if (p[a[i]] > p[a[i+1]]) break;
    }
    printf("%d\n", n-i);
}

int main()
{
 //   freopen("in.txt", "r", stdin);

    init();
    solve();

    return 0;
}
原文地址:https://www.cnblogs.com/JMDWQ/p/2590976.html